我正在构建一个应用程序,其数据库系统至关重要,并且需要具有可扩展性,因为它的所有值都将存储在数据中。
我正在制作一个实时投票系统。
我对SQL和MongoDB感到满意,所以它几乎不是一个决定因素(虽然我更倾向于喜欢MongoDB结构和JS :))
但是,从我在网上看到的所有内容来看,我仍然对我的决定感到不安。
我想要做的是结合两者的优势:
我看到的巨大优势是:
我的问题是:
答案 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开箱即用地支持这些类型时,例如Ecto,Active Record等。
答案 3 :(得分:0)
我想抛出另一个建议来建模可以扩展的对象和关系。
有些值得深思的话: