【发布时间】:2015-11-14 01:18:31
【问题描述】:
我正在考虑将我的 Web 应用程序从 SQL 数据库迁移到键值存储,这样我就可以水平扩展我的应用程序。
我正在计划如何迁移我的架构 - 我确信必须有一个这样做的模式。
我将举一个米老鼠的逻辑例子来展示我的想法。这是一个关系数据库中的简单库系统,包含Books、Persons 和BorrowEvents。您可以使用BorrowEvent 从Books 加入Persons,以查看谁借了Book。
Book
- BookID
- BookTitle
Person
- PersonID
- PersonName
BorrowEvent
- BorrowEventID
- BookID
- PersonID
现在让我们尝试以下重构:
[Key][Value]
- ID/BookName
- ID/PersonName
- ID/[String]"BorrowEvent-"+[ID of BookName]+"-"+[ID of PersonName]
这通过查询 BorrowEvent 来工作,使用正则表达式拆分值的字符串以获取 ID。
现在这有几个限制。如果我想在我的Book 中添加一个Author,我必须添加一个额外的跃点来检索我的图书信息。如果我希望Person 有名字和姓氏,也是如此。
我想这种从关系存储到键值存储的转换必须有一个模式。 (或多种模式)。我只是不知道叫什么名字。
我的问题是:我应该使用什么模式将我的关系 SQL 数据库重构为键值存储?
假设:
- 假设这是一个逻辑重构,而不是物理重构。
【问题讨论】:
-
关系型数据库一般可以处理n-ary关系;当您在自己的代码中重新发明关系 DBMS 功能时,分解成二元关系可能意味着完整性和/或性能损失。我想起了爱因斯坦的名言“让事情尽可能简单,但不要更简单”。
-
或者引用:“对于每个复杂的问题,都有一个清晰、简单和错误的答案。”
标签: design-patterns refactoring relational-database key-value horizontal-scaling