混合数据库系统:NoSQL用于数据,SQL用于关系。最佳实践?

时间:2013-04-24 13:02:55

标签: database-design nosql database

我正在构建一个应用程序,其数据库系统至关重要,并且需要具有可扩展性,因为它的所有值都将存储在数据中。

我正在制作一个实时投票系统。

我对SQL和MongoDB感到满意,所以它几乎不是一个决定因素(虽然我更倾向于喜欢MongoDB结构和JS :))

但是,从我在网上看到的所有内容来看,我仍然对我的决定感到不安。

我想要做的是结合两者的优势:

  • 拥有对象(用户,项目,评论等)的无文档文档
  • 拥有关系的SQL表(表User-Items,User-Comments等)
  • 每当有投票或定期间隔时,复制投票都会产生一个noSQL文档(以便在投票结果显示时获得速度)

我看到的巨大优势是:

  1. 在查询文档时(例如,用户显示他的个人资料),我拥有NoSQL的所有好处(速度,所有在一个地方,架构灵活性等)。
  2. 在进行统计(例如投票数)时,我拥有所有SQL好处
  3. 并行化:我可以在SQL中获取投票,在aSync模式下获取文档
  4. 读得快,写得慢(在我的情况下并不重要)
  5. 始终保持关系完整性
  6. 我的问题是:

    • 这样做是一种好习惯吗?网络似乎很害羞
    • 我是否优化花生,即使是高DB负荷? (将文档提取与完整SQL进行比较,以及查询,例如select * from table where primary_key = XXX)

4 个答案:

答案 0 :(得分:4)

如果您想将NoSQL数据库与RDBMS一起使用的唯一原因是为了获得速度和灵活性,我建议使用缓存服务器(例如Memcache)。您可以使用sql语句构建文档/结果,并使用memcache中的单个键值存储它以便稍后检索它。它比MongoDB更容易实现。但它当然取决于您的要求,如果您真的只想通过使用密钥或计划对文档使用更复杂的查询来进行文档查找。

答案 1 :(得分:4)

"最佳实践"这是一个可怕的术语 - 它通常被用来证明直觉,#34;这就是我们总是如何做到这一点,或其他偏见。

但是,您描述的解决方案有很多好处(您提到一些),但也有一些明显的缺点,主要是因为您在两个不兼容的数据存储中分离了您的问题域的知识,这开辟了很多机会用于复制 - 但也用于不一致。

例如,某个标识符标识给定用户的知识将在NoSQL系统和数据库之间共享。如果一个系统删除该用户,则另一个系统处于不一致状态。给定用户的配置文件将分为两个系统,并且两者都没有完整的图片;你需要大量的内务同步代码。

在您的平台上工作的开发人员需要两种技术堆栈的专业知识 - 想象一下试图调试给定用户的评论计数为何不正确。

您现在有两个失败点 - 如果NoSQL或SQL数据库失败,整个系统都会中断。失败可能并不意味着崩溃 - 它也可能意味着性能问题,升级问题或备份问题。

软件解决方案拥有多个系统,每个系统都拥有一部分数据并不罕见,拆分通常是沿着业务领域线(CRM系统知道您的个人资料,支付系统是您的信用卡详细信息,电子商务系统知道你订购了什么);沿技术线分割该部门将创建一个具有多个故障点的复杂架构。

我不认为这些好处超过了这些缺点。

答案 2 :(得分:1)

7年后,我开始回答自己的问题,感觉自己现在可以帮助过去的我。

今天,我会去PostgreSQL JSON types

这允许仍然具有表,关系和索引,这些表,关系和索引非常适合理解和原子性,以及users表中的可扩展字段,例如看起来像这样的identity字段:

identity {
  firstName: "John",
  lastName: "Doe",
  address: "5 example st",
  postCode: "XXX",
  city: "Example city"
}

可通过以下方式查询:select * from users u where u.identity ->> lastName = 'Doe'(不确定语法的100%)。

尽管起初这可能很令人惊讶,但效果很好。最好的方法是当ORM开箱即用地支持这些类型时,例如EctoActive Record等。

答案 3 :(得分:0)

我想抛出另一个建议来建模可以扩展的对象和关系。

有些值得深思的话:

  1. 正如您所说,为MongoDB等文档数据库中的实体/对象建模。
  2. 将关系存储在图形数据库中,如Titan或Neo4j。在我看来,这些系统更适合存储复杂的关系。您可以轻松地在许多复杂关系上进行遍历,然后在图中找到目标节点/顶点时,可以从Mongo加载文档。
  3. 考虑像Riak这样的东西,它是一个NoSQL文档存储,在文档(关系)之间有链接。他们建议不要使关系过于复杂,但可以将文档链接在一起而无需其他系统。