10

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

我正在制作一个现场投票系统。

我对 SQL 和 MongoDB 很满意,所以这几乎不是决定因素(尽管这些时候我更喜欢 MongoDB 结构和 JS :))

但从我在网上阅读的所有内容来看,我仍然对我的决定感到不舒服。

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

  • 拥有对象的 noSQL 文档(用户、项目、评论等)
  • 拥有用于关系的 SQL 表(表 User-Items、User-Comments 等)
  • 每当有投票时或定期在 noSQL 文档中复制投票结果(在投票结果显示上也能提高速度)

我看到的巨大优势是:

  1. 在查询文档时(例如,用户显示他的个人资料),我拥有 NoSQL 的所有优势(速度、集中在一个位置、架构灵活性等)
  2. 在进行统计时(例如投票数),我拥有 SQL 的所有优势
  3. 并行化:我可以在 SQL 中获取投票,在 aSync 模式下获取文档
  4. 读快,写慢(在我的情况下没关系)
  5. 始终保持关系完整性

我的问题是:

  • 这样做是个好习惯吗?网络似乎对此很害羞
  • 即使数据库负载很高,我是否也在优化花生?(将文档获取与完整的 SQL 和查询进行比较,例如 select * from table where primary_key = XXX)
4

4 回答 4

7

“最佳实践”是一个可怕的术语——它经常被用来证明直觉、“这就是我们一直这样做的方式”或其他偏见。

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

例如,给定用户由某个标识符标识的知识将在您的 NoSQL 系统和您的数据库之间共享。如果一个系统删除了该用户,则另一个系统将处于不一致的状态。给定用户的个人资料将被拆分到两个系统中,并且都没有完整的图片;你需要大量的家务同步代码。

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

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

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

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

于 2014-03-18T17:16:25.057 回答
5

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

于 2013-04-25T10:43:08.603 回答
2

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等。

于 2020-10-06T10:23:07.507 回答
0

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

一些值得思考的食物:

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