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