数据建模
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