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

这篇具有很好参考价值的文章主要介绍了Elasticsearch实战(二十三)---ES数据建模与Mysql对比 一对多模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

  1. 一对一 模型
  2. 一对多 模型
  3. 多对多 模型

1.一对多 模型

我们现在有两个模型, 一个商品Product, 一个分类Category , 我们对比下一对多模型如何处理 ,一个分类下有多个商品, 商品对分类 1:N 1对多关系

1.1 Mysql建模

对于一对多的数据模型, mysql 可以用2个表 来在Mysql中实现 一对多,通过关联外键主键等, 查 produce_id的同时, 再根据 attribute_id属性id去 关联 查属性表查出商品和分类的关系
手机是一个分类, 但是 手机下面分为 华为手机, 小米手机, VIVO手机等 一对多模型
es 一对多,ElasticSearch,elasticsearch,Nest结构好处,ES建模问题缺陷,ES建模一对多数据结构,Nested object

#关联查询
select * from category left join product on category.category_id = product.category_id;

Table :category 手机分类表

字段 类型
id 唯一主键,自增
category_id 分类id
category_name 分类名称
category_remark 分类标签

Table :product 商品表 基本信息 包含分类 id 用于关联

字段 类型
id 唯一主键,自增
product_id 商品id
category_id 分类id
product_name 商品名称
product_price 商品价格
product_number 商品数量

2.一对多 Index ES 数据模型

对于ES 这种1:N的, 如果我们的场景是查出 一个分类下面的所有商品, 我们应该如何建模?
三种方式

2.1 类似Mysql, 依旧创建两个Index索引库

一个库存 category, 一个存product, 想要查一个分类下面的所有商品 分2步, 先查分类,再根据category_id去 商品库中查所有的商品
优点: 设计简单,参照Mysql,依旧没有冗余数据
缺点: 查询逻辑复杂, 需要多次调用不同索引库的Index去查询API,效率低下
这种方式我们不推荐使用,这里就不再给出 Index mapping结构

2.2 采用ES架构 嵌套数组模型

既然一个分类下多个商品,那我就按照 { 分类1:[商品1, 商品2, 商品3, …, 商品X] } 把所有的商品存储在 一个分类下的数组结构中, 乍一看挺好的,一次性能取出来所有数据
优点: 依旧没有冗余数据, 更新的时候只更新1条数据
缺点: ES的更新document是把原来的记录删掉,重新再插入的机制,如果更新一个分类的名称如果按照分库结构, 只需要更细一个index库的 一条数据就即可, 但是采用ES嵌套数组就要把下面的所有的商品全都查出来,然后更新完他的分类字段后,再全部插入,等同于该分类的所有商品全部更新一遍, 操作数据量大,而且更新不方便
这种方式我们同样不推荐使用, 这里不再给出 Index mapping结构

2.3采用ES架构 冗余部分字段Object对象模型

既然嵌套数组模型不太符合,那我采用冗余方式, 我现在把所有的分类全都存一份 存到商品信息中, 商品信息式最小粒度{ {商品1: 属性, 分类信息1}, {商品2: 属性, 分类信息1}, {商品3: 属性, 分类信息2}, {商品4: 属性, 分类信息2} }, 以冗余分类数据到商品信息中来实现关联
优点: 更新一个商品,不会再更新所有的商品,商品粒度最小
缺点: 更新一个分类, 更新多条数据, 就要更新所有商品的分类的数据, 全部都需要更新, 有多少个此分类的商品,就要更新多少条

  • 操作简单, 一次性就能搜索出所有的结果字段

3.冗余ES字段Object对象模型实战

我们采用大致类似与 这样的 Mysql Table :produce 商品表 基本信息

字段 类型
id 唯一主键,自增
product_id 商品id
product_name 商品名称
product_price 商品价格
product_number 商品数量
category_name 分类名称
category_remark 分类标签

下面创建Index mapping结构, 我们把多个手机相同的分类信息,作为冗余字段 冗余到 手机基本信息中

索引库结构

PUT /phone_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "productId": {
        "type": "long"
      },
      "productName": {
        "type": "keyword"
      },
      "productPrice": {
        "type": "long"
      },
      "productNumber": {
        "type": "long"
      },
      "category": {
        "properties": {
          "categoryName": {
            "type": "keyword"
          },
          "categoryRemark": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

下面我们给 phone_index 索引库插入数据, 插入 6条手机信息

put /phone_index/_bulk
{"index":{"_id":1}}
{"productId":1,"productName":"P20","productPrice":4000,"productNumber":50,"category":{"categoryName":"华为手机","categoryRemark":"高端"}}
{"index":{"_id":2}}
{"productId":2,"productName":"Honor30","productPrice":2000,"productNumber":100,"category":[{"categoryName":"华为手机","categoryRemark":"很好"},{"categoryName":"荣耀手机","categoryRemark":"便宜"}]}
{"index":{"_id":3}}
{"productId":3,"productName":"小米8","productPrice":2000,"productNumber":600,"category":{"categoryName":"小米手机","categoryRemark":"中端"}}
{"index":{"_id":4}}
{"productId":4,"productName":"红米10","productPrice":2500,"productNumber":300,"category":{"categoryName":"小米手机","categoryRemark":"发烧"}}
{"index":{"_id":5}}
{"productId":5,"productName":"小米Max","productPrice":4000,"productNumber":800,"category":{"categoryName":"小米手机","categoryRemark":"很好"}}

4.冗余ES字段Object对象模型缺陷

上面的结构似乎看起来很合理,而且能解决一部分问题,但是这种对象结构是存在很大缺陷的,为什么 ?

是因为底层ES在存储对象结构的时候都是以数组的形式存储, 比如这个Honor30 手机牌子 ,底层数据存储的就是

  • categoryName:[华为i手机, 荣耀手机]
  • categoryRemark[很好, 便宜]
  • 这里已经失去了绑定关系了, 比如 华为手机-很好, 荣耀手机-便宜 这种对应关系
  • 查询的时候就会出现 华为手机-便宜的 这种数据出现
    es 一对多,ElasticSearch,elasticsearch,Nest结构好处,ES建模问题缺陷,ES建模一对多数据结构,Nested object
4.1 演示Object对象缺陷

我们要查询 华为手机 便宜的 标签,must 查询, 分类:华为手机,描述:便宜

按照存储的数据, 这种数据应该不存在


get /phone_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "category.categoryName": "华为手机"
          }
        },
        {
          "match": {
            "category.categoryRemark": "便宜"
          }
        }
      ]
    }
  }
}

查询结果 不是我们想要的, 是错误的
es 一对多,ElasticSearch,elasticsearch,Nest结构好处,ES建模问题缺陷,ES建模一对多数据结构,Nested object

或者 我们再查询以下 华为手机-发烧的 场景, 按照我们的数据, 不存在任何数据把华为手机和发烧关联

must查询, 分类:华为手机, 标签:发烧

get /phone_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "category.categoryName": "华为手机"
          }
        },
        {
          "match": {
            "category.categoryRemark": "发烧"
          }
        }
      ]
    }
  }
}

查询结果错误, 要查询 华为手机-发烧的数据,结果把 小米手机查询出来了,这是明显的错误
es 一对多,ElasticSearch,elasticsearch,Nest结构好处,ES建模问题缺陷,ES建模一对多数据结构,Nested object

5. 解决办法

Object对象存储会出现上面的问题, 为了解决这种问题,我们要采用Nest结构来存储数据, 这种Nest结构底层不是数组存储的,就不会出现上面的情况

下一篇 我们来介绍Nest结构 解决对象冗余存储Object对象的缺陷文章来源地址https://www.toymoban.com/news/detail-712897.html

到了这里,关于Elasticsearch实战(二十三)---ES数据建模与Mysql对比 一对多模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第二十三天:mysql数据备份及还原

    一、备份类型 完全备份,部分备份 完全备份:整个数据集 部分备份:只备份数据子集,如部分库或表 完全备份、增量备份、差异备份 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂 差异备份:仅备份最近一次完全备

    2024年02月19日
    浏览(26)
  • es_MySQL、HBase、ElasticSearch三者对比详解

    MySQL:关系型数据库,主要面向OLTP(OLTP,也叫联机事务处理(Online Transaction Processing)),支持事务,支持二级索引,支持sql,支持主从、Group Replication(MGR 是一个新的高可用与高扩展的方案,集群中的任何节点数据都是一样的,可以实现任何节点都可以写入,实现了真正意义

    2024年02月02日
    浏览(28)
  • 二十三、SQL 数据分析实战(10个简单的SQL题目)

    现有一张参加比赛的队伍名称表 easy_competition_list,easy_competition_list 表的数据如下所示: 【题目1】每个参赛队伍都会和其他参赛队伍开展一次组队比赛,要求输出两两参赛队伍的所有比赛情况组合(两者分别为队伍A和队伍B),并按照队名依次升序排列。输出内容包括:队伍

    2024年02月11日
    浏览(48)
  • Redis、Elasticsearch(ES)、RocketMQ和MYSql 持久化对比

    在现代大数据和分布式系统中,数据持久化是一个至关重要的话题。本文将针对 Redis、Elasticsearch(ES)、 RocketMQ和MYSql 这四种常见的数据存储和消息队列系统进行持久化方面的对比分析,帮助读者更好地了解它们各自的特点和适用场景。 ### Redis 1. **特点**:    - 内存数据库

    2024年04月10日
    浏览(53)
  • 【ElasticSearch教程】--- Elasticsearch 系统架构(二十三)

    一个运行中的 Elasticsearch 实例称为一个节点,而一个 Elasticsearch 集群中包含一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。 当一个节点被选举成为主节点

    2024年02月07日
    浏览(26)
  • SpringBoot实战(二十三)集成 SkyWalking

    官方网址: https://skywalking.apache.org/ 官方文档: SkyWalking 极简入门 | Apache SkyWalking SkyWalking 是一个 开源的分布式跟踪系统 ,可以用于监控和诊断分布式系统的性能问题。它可以跟踪应用程序中的请求流,并收集与请求相关的信息,如服务调用、数据库操作、消息队列等。Sky

    2024年02月15日
    浏览(29)
  • Elasticsearch实战-数据同步(解决es数据增量同步)

    之前测试的数据都是一次从mysql导入到es,随着时间的推移,每天都有可能发生增删改查,不可能每次都全量同步,所以需要考虑增量同步问题。 缺点: 耦合性高,服务之间会相互影响 依赖消息队列的可靠性 启动:端口8099

    2024年02月11日
    浏览(61)
  • 【Elasticsearch】小白实战!ES使用Reindex迁移数据

    文章有点长,如果你想认真阅读,建议到我语雀文档上观看,格式友好 - ES 迁移工作 最近有一个需求是需要我负责将服务器A里的 ES 数据迁移到服务器B上,但是由于环境不通,所以就先在公司的测试环境和我本地上进行测试,因为之前没有接触过 ES 数据的迁移,所以上手时

    2024年02月05日
    浏览(25)
  • linux学成之路(基础篇(二十三)MySQL服务(中)

    目录 MySQL服务之SQL语句 一、SQL语句类型 一、 DDL语句 二、DML语句 三、DCL语句 四、DQL 语句 二、 数据库操作 一、查看 二、创建 三、进入  四、删除数据库 五、更改数据库名称 六、更改字符集 三、数据表管理 一、数据类型 一、数值类型 TINYINT SMALLINT INT BIGINT FLOAT(M,D) 二、

    2024年02月15日
    浏览(31)
  • 【第二十三篇】Burpsuite+SQL注入实现登录绕过等(靶场实战案例)

    存在一个业务场景如下 筛选商品时,后端查询语句如下: 只有商品名匹配且该商品已发布(released=1),客户端才能回显数据。 点击Lifestyle时,页面回显 生活方式 有关商品,并可知参数以GET方

    2024年04月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包