除了Google / Bigtable场景外,何时不适合使用关系数据库?为什么不适合?应该使用什么?(你是否有“吃过亏”的经历?)
除了Google / Bigtable场景外,何时不适合使用关系数据库?为什么不适合?应该使用什么?(你是否有“吃过亏”的经历?)
根据我的经验,当以下任何一个条件成立时,您不应使用关系型数据库:
深度层次结构和图形不适合转换为关系表。即使使用像 Oracle 的 CONNECT BY
这样的专有扩展也很难通过 SQL 追踪树形结构。
对于只读应用程序,关系型数据库在简单读取访问方面添加了很多额外开销。虽然事务处理和参照完整性很强大,但对于某些应用程序来说可能过于臃肿。因此,使用类似文件隐喻的方式已经足够好。
最后,如果没有需要预期之外的查询,您就不需要关系型数据库的完整查询语言。如果没有人问诸如“我们在东海岸售出了多少 5% 折扣的蓝色小部件,并按销售员分组?”,那么您可以自由地不使用数据库。
关系型数据库范式对数据的使用进行了一些假设。
这些假设支持简单性和结构性,但代价是灵活性受到限制。并不是所有的数据管理任务都适合这种结构。例如,具有复杂属性或可变属性的实体就不适合。如果需要在关系型数据库解决方案不支持的领域获得灵活性,则需要使用不同类型的解决方案。
对于不同要求的数据管理,还有其他解决方案。例如,语义Web技术允许每个实体定义自己的属性,并通过将元数据视为数据一样的属性来自我描述。这比关系型数据库强加的结构更灵活,但灵活性也带来了自己的代价。
总之,应该为每项工作选择正确的工具。
另请参见我回答“Next-gen databases”中的其他答案。
有三种主要的数据模型(C.J.Date,E.F.Codd),我在其中添加了一个平面文件:
分层和网状都可以在关系型中表示,而关系型也可以用另外两个来表示。
关系型被认为更好的原因是其声明性质和标准化,不仅在数据检索语言上,而且在数据定义语言上,包括强有力的声明性数据完整性,支持稳定的、可扩展的、多用户管理系统。
这些优点是有代价的,对于将长期数据以可预见的形式存储的系统(多应用程序)来说,大多数项目都发现这是一个很好的比率。
如果您不是正在构建一个系统,而是一个单一的应用程序,可能只有一个用户,并且您相当确信您不会很快想要多个应用程序使用您的数据,也不会有多个用户,则您可能会发现更快的方法。
此外,如果您不知道要存储哪种类型的数据以及如何对其进行建模,则关系模型的优势就浪费了。
如果您并不太关心数据的完整性(这也可能是可以接受的),那么可以这样做。
所有数据结构都针对特定的使用场景进行了优化,只有关系型数据库如果被正确建模,才能以语义中立的方式尝试呈现“现实”。那些与关系型数据库有不好经历的人通常没有意识到他们如果使用其他类型的数据模型会遇到更糟糕的情况。恶劣的实现是可能的,尤其是在关系型数据库领域,因为相对容易建立复杂模型,所以你可能会遇到棘手的问题。即使如此,当我尝试想象同样的情况在xml中时,我总感觉更好。
在我看来,关系型模型之所以出色的一个例子是它将复杂度与涉及SQL的问题的简短性之比优化得很好。
我建议您访问High Scalability博客,该博客几乎每天都会讨论这个主题,并有很多关于选择分布式哈希等替代RDMBS的项目文章。
简单地说(但非常不完整),并非所有数据都能够以高效的方式转换为表格形式。例如,如果您的数据本质上是一个大词典,则可能存在比纯粹的RDBMS更快的替代方案。尽管如此,这主要是关乎性能问题,如果在一个项目中性能并不是主要问题,而稳定性、一致性和可靠性等方面更为重要,那么当RDBMS是一种更成熟、更发展的方案,并且得到了所有语言和平台的支持以及众多可供选择的解决方案时,我认为深入研究这些技术并没有太大意义。