codefollower / My-Blog

我的博客
812 stars 134 forks source link

re 关系模型的实质 #14

Closed codefollower closed 8 years ago

codefollower commented 8 years ago

有人提起王同学这篇老文<<关系模型的实质>>跟原来的版本相比已经删掉很多内容了。 文章随便看看就好了,这不是他的研究方向。有很多值得提的,随便捡几个:

  1. 关系数据模型不是数据结构,而是数据结构 + 数据操作 + 数据上的约束 想通过C语言或Java语言来描述约束不是不可以,但没有SQL简洁, 比如可以用Java在类的字段上加注解,然后标明它是否可以为null,长度是多少之类的。 用关系代数或SQL来描述数据操作而不用程序语言就是为了简单, 让数据库实现者优化起来更容易。 现在很多数据库也都支持直接用Java和JavaScript来写存储过程和自定义函数的。

  2. 变长记录这种问题取决于具体的数据库实现,但凡先进点的数据库都是支持变长记录的,而且在修改后也可以很容易的做到不会产生Page Overflow, 我在Lealone中用了Copy On Write B-Tree就轻松搞定了这类问题。 我以前提过不同数据模型的关系: 5种主流的数据模型,从复杂到简单,从松散到规整,排列成这样: 图 -> 文档 -> 列族(或聚簇) -> 关系 -> 键值。键值模型如果在乎值的内容,切开来就变成关系模型中的域(字段),把多个域分组为一个族,关系模型就变成列族(或聚簇) ,允许任意层次的聚簇就变成树状的多文档嵌套,文档之间有联系就变成图。 看似复杂,其实只不过是一个数据编解码的过程。

  3. NoSQL的出现不是因为SQL表达能力太弱,而是因为它过于强大了, 有些功能在分布式场景下不好实现,比如join, 只能通过大量冗余把相关的数据聚在一起,这样在更新时不用考虑分布式事务, 查询时不需要跨多个节点传输数据。 MongoDB和Cassandra、HBase这类数据库都是不能很好的支持join的, 都是通过冗余来避免上面所说的两个问题。 用JSON来描述CRUD其实是没有SQL简洁的,MongoDB的官方文档上有对比, JSON的出现更多的是满足那些不想学SQL的码农的需求。

  4. HBase、Cassandra都不是列存储,前者其实是列族存储,后者是行存储, NoSQL不会朝简单的RPC方向发展的,而是SQL化,比如Cassandra的CQL就是类SQL的语言,HBase已经有了挺多的SQL引擎,比如Apache Phoenix RDBMS和NoSQL都会朝NewSQL的方向走。