关系型数据库的范式化设计
范式化设计的主要目标是:减少不必要的更新
- 1NF:消除非主属性对键的部分函数依赖,不重复的列(关系型数据库的基本要求)
- 2NF:消除非主属性对键的传递函数依赖,非主属性完全依赖于主关键字
- 3NF:消除主属性对键的传递函数依赖,属性不依赖于其他非主属性
- BCNF:主属性不依赖主属性,3NF的基础上,数据库表中如果不存在任何字段对任一候选关键字字段的传递函数依赖则符合BCNF
范式化的问题
- 数据库范式化,就需要join越多的表,导致查询缓慢
- 规范化节省了存储空间,但是存储空间越来越便宜
- 范式化简化了更新,但是读操作可能更复杂、耗时
反范式化设计
- 不使用关联关系,而是文档中保存冗余的数据拷贝
- 优点:无需Joins操作,数据读取性能好
- 缺点:不适合在数据频繁改动的场景
关于ES
ES不擅长处理关联关系,优先采用反范式化设计。ES处理关联关系的方法:
- 对象类型
- 嵌套对象
- 父子关联关系
- 应用端关联
Nested Object | Parent/Child | |
---|---|---|
优点 | 文档存储在一起,读取性能高 | 父子文档可独立更新 |
缺点 | 更新嵌套的子文档时,需要更新整个文档 | 需要额外的内存维护关系。读取性能相对差 |
适用场景 | 子文档偶尔更新,以查询为主 | 子文档更新频繁 |
嵌套对象 (Nested Object)
对于没有使用嵌套对象的数组类型,数据会被扁平化处理,是无法区分数据是来自哪个Item(如Demo中的 first name, last name)。Nested Object 数组,是独立的多个对象,不存在被扁平化处理的问题,所以可以正常的区分Item(如Demo中的 first name, last name)
DELETE my_movies
# 电影的Mapping信息
PUT my_movies
{
"mappings" : {
"properties" : {
"actors" : {
"properties" : {
"first_name" : {
"type" : "keyword"
},
"last_name" : {
"type"