数据建模
- 对事实世界进行形象形容的工具和办法
- 通过形象的实体以及实体之间的分割的模式去形容业务规定,从而实现对事实世界的映射。
-
概念模型
- 确定零碎的外围需要和范畴边界,设计实体和实体之间的关系
-
逻辑模型
- 进一步梳理业务需要,确定每个实体的属性 关系 束缚规定
-
物理模型
- 联合具体的数据库产品,在满足业务读写性能等需要的前提下确定最终的定义
- mysql mongodb elasticsearch
- 第三范式
es 中的数据建模
es 是基于 lucene 以倒排索引为根底实现的存储系统,不遵循关系型数据库的范式约定
mapping 相干字段
- enable true|false 仅存储,不做搜寻和聚合剖析
- index true|false 是否构建倒排索引
- index_options docs|freqs|positions|offsets 存储倒排索引哪些信息
- norms true|false 是否存储归一化参数,如果字段仅仅用于过滤和聚合剖析 可敞开
- doc_values true|false 是否启用 doc_values 用于排序和聚合剖析
- field_data false|true 是否为 text 类型启用 fielddata 实现排序和聚合剖析
- store false|true 是否存储该字段
- coerce true|false 是否开启主动数据类型转换性能,例如字符串转为数字,浮点转为整型
- multifields 多字段 灵便应用多字段来解决业务多样性需要
- dynamic true|false|strict 管制 mapping 自动更新
- date_detection true|false 是否自动识别日期类型
何种类型
- 字符串类型 须要分词设定为 text 否设置为 keyword
- 枚举类型 基于性能思考将其设定为 keyword 类型,即使该数据为整型
- 数值类型 尽量抉择贴近的类型,例如 byte 即可示意所有数值时,选用 byte 而不是 long
- 其余类型 比方 布尔类型 日期 地理位置等
是否须要检索
- 齐全不须要检索 排序 聚合剖析 enabled 设置为 false
- 不须要检索的字段 index 设置为 false
-
须要检索的字段 能够通过如下设置设定须要存储的粒度
- index_options 联合须要设定
- norms 不须要归一化数据时敞开即可
reindex
指重建所有数据的过程 个别产生在如下状况
- mapping 设置变更 例如字段类型变动 分词器字典更新等
- index 设置变更 例如 分片数更改等
- 迁徙数据
es 提供了线程 api 实现该工作
- _update_by_query 在现有索引上重建
- reindex 在其余索引上重建
reindex task
数据重建的工夫受源索引文档规模影响 规模越大 所需工夫越多 此时须要设定 url 参数 wait_for_completion 为 false 进行异步执行,es 以 task 来形容工作
es 提供了 taskapi 来查看工作执行的进度和相干数据
对 mapping 进行版本治理
- 蕴含在代码或者专门以文件进行治理,增加正文 退出 git 等版本治理仓库中 不便回顾
- 为每个减少的 metadata 字段 在其中保护一些文档相干的元数据 不便对数据进行治理
避免字段过多
- 字段过多,难于保护
- mapping 信息存储在 cluster state 中 过多字段导致 mapping 过大,最终导致变慢
- 听过设置 index.mapping_total_fields.limit 能够限定索引中最大字段数 默认 1000
- 能够通过 key value 的形式解决字段过多的问题 然而并不完满
keyvalue 形式
尽管通过此种形式极大低缩小 field 数目 但也有害处
- query 语句的复杂度飙升 且有一些无奈实现的性能,例如聚合剖析
- 不利于 kibana 剖析
- 个别字段过多的起因时因为没有高质量的数据建模导致的 例如 dynamic 设置为 true
- 思考拆分多个索引解决问题