在阅读了Bret Taylor(FriendFeed的联合创始人,Facebook的当前首席技术官)How FriendFeed uses MySQL to store schema-less data撰写的一篇令人震惊的文章后,我开始怀疑是否有使用RDBMS的最佳实践,如Oracle,MySQL,或PostgreSQL用于存储和查询无模式数据?
当NoSQL成为新热点时,很少有人愿意承认他们正在使用关系数据库,这使得很难找到关于该主题的好文章。如何将无模式(或“面向文档”)数据库实现为关系数据库之上的层?
答案 0 :(得分:8)
这是本主题中的经典文章:http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html(使用MySQL作为NoSQL - 在商品服务器上超过750,000 qps的故事)
答案 1 :(得分:3)
在SQL中存储无模式数据基本上意味着实现恰好使用SQL作为后端的键值存储。由于您没有使用任何关系功能,并且架构相当简单,因此您无法通过这种方式找到有关设计SQL数据库的大量信息。但是,您应该能够找到有关设计适用于键值存储的应用程序的更多一般信息。
答案 2 :(得分:2)
我已经广泛研究过这个问题。使用“属性”表(主要使用键/值对)在RDBMS中对无模式数据进行建模是相当简单的。困难的部分是索引和查询你的东西。 (基本上,Friendfeed所处理的所有复杂性都集中在这个问题上。)
如果索引属性表,则最终会得到针对所有属性的索引。这是不可取的,因为它只会增加开销,因为您只想查询某些属性。此外,您肯定希望通过复合索引访问您的东西。模拟复合索引非常复杂。我发现的唯一解决方案要求您使用模式为此目的构建自己的索引 - 非常麻烦。我看的越多,看起来越不实用。
此问题的一个很好的解决方案依赖于使用部分索引(又名过滤索引)。
答案 3 :(得分:1)
您不会在这个主题上找到太多,因为大多数人都会构建单一用途的解决方案。他们的解决方案旨在满足一个需求。 NoSQL数据库在构建这些单一用途的数据存储时会带来很多麻烦,但是你需要付出没有灵活性以及RDBMS的一些内置控件和安全功能的费用。
答案 4 :(得分:1)
Quora的工程师使用MySQL as the data store instead of NoSQLs such as Cassandra, MongoDB, CouchDB etc。它们partition data at the application level,这意味着它们仅在必要时对数据进行分区,如果可能,将数据保存在一台计算机上,并使用主键哈希在多个数据库之间划分较大的数据集。数据的应用程序级分区以这样的方式工作:满足一组标准的数据被“切换”到一个数据库,而不符合这些标准的数据(或者可能是一组不同的标准)可以被发送到不同的数据库