数据建模

date
Aug 2, 2021
slug
elasticsearch-guide-data-scheme
status
Published
tags
Elasticsearch
读书
summary
type
Page

关联关系的处理

应用层处理
应用层取 user 数据,再查询 user 下的博客数据。
 
非规范化存储,即冗余存储
在博客文档中,冗余存储用户名
 
字段折叠
让 name 支持全文索引,在 name 下增加 raw 字段实现 term 精准匹配
 
非规范化下的并发
分布式场景下对多个文档进行更新,涉及到并发控制问题。Elasticsearch 在单文档上的修改是原子的,但在并发更新多个文档时却不是,解决办法有:
  • 全局锁:完全串行化
  • 文档锁:每个文档都加锁
  • tree 锁:在文档加排它锁,在路径加共享锁
 

嵌套对象

使用嵌套对象来将有一定关联关系的实体做关联
如博客实体和博客的评论实体的关系,如果使用对象数组来表示:
对象数组会被打平,结构如下:
这样会导致这样的查询会得出结果:
但实际上 Alice 不是 28 岁而是 31 岁,正式因为 John 和 Alice 两个数组中的对象被打平了,名字和年龄失去了原本的关系导致的。
可使用嵌套对象来保持对象间的关系,即在创建 mapping 时指定 type 类型为 nested 即可:
之后可使用查询如下:
嵌套对象的缺点:一般用于有限个紧密相关的但又不是很重要的实体。缺点如下:
  • 对嵌套文档做增删改时,整个文档都要重新索引,嵌套文档越多成本越大。
  • 查询结果是整个文档,而不仅仅是匹配到的嵌套文档
 

父子文档

例如一家公司 company 在不同城市有不同分公司 branch,每个分公司有多个员工 employee

© 菜皮 2020 - 2023