Nosql 为无模式数据使用关系数据库-最佳实践

Nosql 为无模式数据使用关系数据库-最佳实践,nosql,relational-database,schemaless,Nosql,Relational Database,Schemaless,读了Bret Taylor(FriendFeed的联合创始人;Facebook的现任首席技术官)写的一篇令人震惊的文章后,我开始怀疑是否有使用RDBMS(如Oracle、MySQL或PostgreSQL)来存储和查询无模式数据的最佳实践 当NoSQL成为新热点时,很少有人愿意承认他们正在使用关系数据库,这使得很难找到关于这个主题的好文章。如何将无模式(或“面向文档”)数据库实现为关系数据库之上的一个层?这是本主题中的经典文章:(将MySQL用作NoSQL-一个商品服务器上超过750000 qps

读了Bret Taylor(FriendFeed的联合创始人;Facebook的现任首席技术官)写的一篇令人震惊的文章后,我开始怀疑是否有使用RDBMS(如Oracle、MySQL或PostgreSQL)来存储和查询无模式数据的最佳实践


当NoSQL成为新热点时,很少有人愿意承认他们正在使用关系数据库,这使得很难找到关于这个主题的好文章。如何将无模式(或“面向文档”)数据库实现为关系数据库之上的一个层?

这是本主题中的经典文章:(将MySQL用作NoSQL-一个商品服务器上超过750000 qps的故事)

在SQL中存储无模式数据基本上意味着实现一个恰好使用SQL作为后端的键值存储。由于您没有使用任何关系特性,并且模式相当简单,因此您不会找到很多关于以这种方式设计SQL数据库的信息。但是,您应该能够找到更多关于设计适用于键值存储的应用程序的一般信息。

您在这个主题上不会找到太多,因为大多数人都构建单一用途的解决方案。他们的解决方案旨在很好地满足一种需求。NoSQL数据库为构建这些单一用途的数据存储带来了很多麻烦,但您需要为没有RDBMS的灵活性、一些内置控件和安全功能付出代价。

我已经对这个问题进行了广泛的研究。使用“属性”表(基本上使用键/值对)对RDBMS中的无模式数据建模非常简单。困难的部分是索引和查询您的东西。(Friendfeed处理的所有复杂性基本上都围绕着这个问题。)

如果对properties表进行索引,则最终会得到针对所有属性的索引。这是不可取的,因为它增加了太多的开销,因为您只想查询某些属性。此外,您肯定希望通过复合索引访问您的内容。对复合索引进行建模非常复杂。我发现的唯一解决方案就是为了这个目的,需要您使用模式构建自己的索引——非常麻烦。我看得越多,它看起来就越不实用


这个问题的一个好的解决方案依赖于使用部分索引(也称为过滤索引)。

Quora的工程师使用。它们(这意味着仅在必要时对数据进行分区)尽可能将数据保存在一台计算机上,并使用主键的散列来跨多个数据库对较大的数据集进行分区。数据的应用程序级分区的工作方式是,满足一组标准的数据被“传递”到一个数据库,而不满足这些标准(或者可能是不同的一组标准)的数据可以被发送到不同的数据库

您的FriendFeed示例看起来很像一个示例。此外,仅仅因为NoSQL是新的黑色,并不意味着关系数据库昨天突然变得如此。
@Robert Harvey:
这篇文章说,“这样的设计很少进入现实世界的生产系统,但是,因为由于需要所有额外的连接,性能往往比糟糕得多。”但似乎很多大公司都在成功地做到这一点!技术上无知的CTO和技术上无知的开发人员一样多。