Elasticsearch实战(二十二)---ES数据建模与Mysql对比 一对一模型

Elasticsearch实战—ES数据建模与Mysql对比实现 一对一模型

我们如何把Mysql的模型合理的在ES中去实现? 就需要你对要存储的数据足够的了解,及对应用场景足够的深入分析,才能建立一个合适的模型,便于你后期扩展
实体之间的关系:

  1. 一对一 模型
    一对一(1:1):一个实体最多只能能另一个实体相关联,另一个实体如是。
    例:一个只能有一张身份证。

  2. 一对多 模型
    一对多(1:n): 一个实体可以和别的实体任意关联(他们只能和前面的实体关联)
    例:一个班有多名学生。

  3. 多对多 模型
    多对多:(n:n):一个实体可以和别的实体任意关联(他们也可以和前面的实体任意关联)
    例:一个学生可以选择多门课程,一门课程对应多名学生。

1.一对一 模型

我们现在有两个模型, 一个商品Product, 一个属性 Attribute , 我们对比下一对一模型如何处理 ,一个商品有一个属性

1.1 Mysql建模

对于一对一的数据模型, mysql 可以用2个表 来在Mysql中实现 一对一, 查 produce_id的同时, 再根据 attribute_id属性id去 关联 查属性表查出商品和商品属性的关系

#关联查询
select * from product left join addribute on product.product_id = attribute.product_id;

Table :produce 商品表 基本信息

字段类型
id唯一主键,自增
product_id商品id
attribute_id属性id
product_name商品名称
product_price商品价格

Table :attribute属性表

字段类型
id唯一主键,自增
attribute_id属性id
product_id商品id
product_number商品数量
product_address商品产地
product_remark商品标签

produce 商品id 字段product_id 的关联属性id 字段attribute_id 轻易的获取两个表的对应关系
既可以通过 produce 商品id 字段 获取属性表 attribute_id 的属性信息
也可以通过 属性表 attribute_id 查出拥有这些属性的所有 的商品product_id
这样我们可以 在Mysql中轻易的实现 两个表结构的关联 实现1:1的商品及属性模型

1.2 Index ES 模型

对于ES 这种1:1的 我们应该如何查询, 正常来说 不会用两个 索引库去存储两份数据, 我们一般都是采用大宽表去实现这种逻辑,我们会把商品及商品的属性 公用一个商品Index库, 通过一个id去关联该商品所有的唯一性信息

  1. 去除掉 attribute_id的 表信息
  2. 把属性表 所有的这些属性 全都和商品 product_id绑定在一起
  3. 多字段形成大宽表 去实现1:1 ES模型设计

为什么要这样设计?

  • 方便查询
  • 没有任何冗余数据
  • 操作简单, 一次性就能搜索出所有的结果字段

Table :produce 商品表 基本信息

字段类型
id唯一主键,自增
product_id商品id
product_name商品名称
product_price商品价格
product_number商品数量
product_address商品产地
product_remark商品标签
xxxx_xxx商品xxx等

下面创建Index mapping结构, 大宽表

{
    "product":{
        "mappings":{
            "_doc":{
                "dynamic":"strict",
                "_all":{
                    "enabled":false
                },
                "properties":{
                    "productId":{
                        "type":"keyword"
                    },
                    "productName":{
                        "type":"text",
                        "analyzer":"ik_max_word"
                    },
                    "productNumber":{
                        "type":"integer"
                    },
                    "productAddress":{
                        "type":"integer"
                    },
                    "productRemark":{
                        "type":"integer"
                    },
                    "xxx":{
                        "type":"keyword"
                    }
                }
            }
        }
    }
}

本文章 分析了 1:1 模型 一个商品Product, 一个属性 Attribute ,对比了mysql如何处理及ES如何设置mappings结构

下一篇 我们着重讲解下 Mysql的一对多 1:n 模型及 ES的一对多模型如何建立

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值