Handling Relationships (原文,译文)
- 应用端连接(Application-side Joins)(原文,译文)
- 数据非规范化(Denormalizing Your Data)(原文,译文)
- 字段折叠(Field Collapsing)(原文,译文)
- 非规范化和并发(Denormalization and Concurrency)(原文,译文)
- 解决并发问题(Solving Concurrency Issues)(原文,译文)
现实世界中,关联关系很重要:博客文章有评论、银行账户有交易、顾客有银行账户、订单有订单项、文件夹有文件和子文件夹。
关系型数据库是专门设计用于管理关系的——这可能对你来说并不奇怪:
- 每一个实体(在关系型数据库中成为行,row)可以通过主键(primary key)唯一确定
- 实体是规范化的。每一个独特的实体只存储一次,其他关联的实体只存储它的主键。改变实体的信息只需要在一个地方进行更改
- 实体的更改具有原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)、持久性(Durable)。(查看更多:ACID Transactions(wikipedia)、ACID(百度百科))
- 大多数关系型数据库支持跨多个实体的ACID事物
关系型数据库一方面对全文检索(full-text search)的支持较弱,另一方面也确实有它们的限制。在查询时关联实体是非常昂贵的——关联的实体越多,查询越昂贵。关联不同硬件上的实体关联查询是极为昂贵的,以至于这是不切实际的。这就对在单一的服务器上能够存储的数据量造成了限制。
Elasticsearch,和大多数NoSQL一样,把世界看做是扁平化的。一个索引是扁平化地存储各个独立的文档。一个单独的文档应该包含决定它能否被搜索到的所有信息。
即使改变ES中的某一个单独的文档具有 ACID ,操作涉及到多个文档就不是这样了(译者注:操作涉及到ES中的多个文档不具备ACID)。如果操作部分失败了,索引是没有办法恢复到它的前一个状态的。
扁平化(FlatWorld)具有下面的优势:
- 索引速度快 并且 无锁(lock-free)
- 搜索速度快 并且 无锁(lock-free)
- 海量的数据可以分布在多个节点,因为每一个文档与其他文档是相互的独立的
但是关系(relationship)确实是非常重要的。因此我们需要联系扁平的世界(FlatWorld)和真实世界。在ES中,我们使用四种技术管理相关联的信息:
- 应用端连接(Application-side joins)(原文,译文)
- 数据非规范化(Data denormalization)(原文,译文)
- 嵌套对象(Nested objects)(原文,译文)
- 父子关系(Parent/child relationships)(原文,译文)
通常最终的解决方案需要混合使用这几种技术。