文章目录

  • 概述
  • 关系型与document类型数据模型对比
    • 关系型数据库
    • 应用Model
    • es文档数据模型
  • 建模方式一:通过应用层join实现用户与博客的关联
    • 构造用户与博客数据
    • 搜索某个用户发表的所有博客
    • 优缺点
  • 建模方式二:通过数据冗余实现用户与博客的关联
    • 构造用户与博客数据
    • 搜索某个用户发表的所有博客
    • 优点和缺点


概述

继续跟中华石杉老师学习ES,第54篇

课程地址: https://www.roncoo.com/view/55


关系型与document类型数据模型对比

举个例子: 部门和员工 ,1个部门下可以有N多个员工 ,部门:员工 = 1:N 1对多的关系。


关系型数据库

部门Department 表

dept_id  name  desc

员工Employee 表 (通过dept_id关联到所属的部门)

emp_id name age gender  dept_id

数据库的设计还是遵循了三范式:将每个数据实体拆分为一个独立的数据表,同时使用主外键关联关系将多个数据表关联起来 , 确保没有任何冗余的数据 .

一份数据,只会放在一个数据表中,比如dept name,部门名称,就只会放在department表中,不会在employee表中也放一个dept name,如果说你要查看某个员工的部门名称,那么必须通过员工表中的外键,dept_id,找到在部门表中对应的记录,然后找到部门名称 。


应用Model

/**
* 部门
**/
public class Department {private Integer deptId;private String name;private String desc;// 部门中存放一个 员工的集合 private List<Employee> employees;}/**
* 员工
**/
public class Employee {private Integer empId;private String name;private Integer age;private String gender;// 所在部门private Department dept;}

es文档数据模型

{"deptId": "1","name": "研发部门","desc": "负责公司的所有研发项目","employees": [{"empId": "1","name": "张三","age": 28,"gender": "男"},{"empId": "2","name": "王兰","age": 25,"gender": "女"},{"empId": "3","name": "李四","age": 34,"gender": "男"}]
}

es更加类似于面向对象的数据模型,将所有由关联关系的数据,放在一个doc json类型数据中,整个数据的关系,还有完整的数据,都放在了一起.


建模方式一:通过应用层join实现用户与博客的关联

构造用户与博客数据


# 让ES自动创建 users索引,并写入一条数据
PUT /users/users/1
{"name":     "小工匠","email":    "artisan@artisan.com","birthday":      "2000-01-01"
}#让ES自动创建 blogs ,并写入一条数据
PUT /blogs/blogs/1
{"title":    "跟石杉老师学ES","content":     "数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联","userId":     1
}

搜索某个用户发表的所有博客


# 第一次搜索  查询name为 小工匠的用户 (这里需要name.keyword 不分词查询)
GET /users/users/_search
{"query": {"term": {"name.keyword": {"value": "小工匠"}}}
}

# 第二次搜索,要放入terms中userId
GET /blogs/blogs/_search
{"query": {"bool": {"filter": {"terms": {"userId": [1]}}}}
}

假设搜索的是,1万个用户的博客,可能第一次搜索,会得到1万个userId , 第二次搜索的时候,要放入terms中1万个userId,才能进行搜索,这个时候性能比较差了 。


优缺点

  • 优点:数据不冗余,维护方便
  • 缺点:应用层join,如果关联数据过多,导致查询过大,性能很差

建模方式二:通过数据冗余实现用户与博客的关联

第二种建模方式:用冗余数据,采用文档数据模型,进行数据建模,实现用户和博客的关联, 在ES的应用中,推荐这种方式建模。

构造用户与博客数据

# 让ES自动创建 users2索引,并写入一条数据
PUT /users2/users2/1
{"name": "小工匠","email": "artisan@artisan.com","birthday": "2000-01-01"
}#让ES自动创建 blogs2 ,并写入一条数据
PUT /blogs2/blogs2/1
{"title": "跟石杉老师学ES","content": "数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联","userInfo": {"userId": 1,"username": "小工匠"}
}

冗余数据就是说将可能会进行搜索的条件和要搜索的数据,放在一个doc中


搜索某个用户发表的所有博客


GET /blogs2/blogs2/_search
{"query": {"term": {"userInfo.username.keyword": {"value": "小工匠"}}}
}

可以看到不需要走应用层的join,先搜一个数据,找到id,再去搜另一份数据,直接走一个有冗余数据的type即可,指定要的搜索条件,即可搜索出自己想要的数据来。


优点和缺点

  • 优点:性能高,不需要执行两次搜索
  • 缺点:数据冗余,维护成本高 ,每次username变化了,同时要更新user type和blog type

一般来说,对于es这种NoSQL类型的数据存储来讲,都是冗余模式…

当然,我们要去维护数据的关联关系,也是很有必要的,所以一旦出现冗余数据的修改,必须记得将所有关联的数据全部更新。

白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联相关推荐

  1. 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  2. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

  3. 计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: http://www.cnblogs.com/lyhabc/p/3828496.html 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享 ...

  4. 白话Elasticsearch60-数据建模实战_Join datatype 父子关系数据建模

    文章目录 概述 官网 示例 概述 继续跟中华石杉老师学习ES,第60篇 课程地址: https://www.roncoo.com/view/55 白话Elasticsearch58-数据建模实战_基于 ...

  5. CSDN产品公告第3期:博客数据统计功能上线,OFFER大挑战等你来!

    各位小主,咱们又见面了!在前两期的公告中,CSDN产品组已感受到大家对我们深沉的爱,再此谢谢大家的褒贬.服务好每一位用户,是我们一直不变的初心. 在过去一周,开发在产品的鞭策下,又带来了哪些功能呢? ...

  6. flask POST请求,数据入库,文件上传,一文看懂,3天掌握Flask开发项目系列博客之三

    flask 实现ajax 数据入库 在正式编写前需要了解一下如何在 python 函数中去判断,一个请求是 get 还是 post. python 文件代码如此所示: # route()方法用于设定路 ...

  7. MongoDB数据建模介绍

    MongoDB数据建模介绍 数据建模需要在满足应用需求.数据库引擎的性能特征.以及数据检索模式之间取得平衡.在设计数据模型时,请始终考虑应用程序对数据的使用场景(比如,查询,更新,和数据处理)以及数据 ...

  8. Elasticsearch之数据建模

    数据建模 英文为 Data Modeling, 为创建数据模型的过程 数据模型(Data Model) - 对现实世界进行抽象描述的一种工具和方法 - 通过抽象的实体及实体之间联系的形式去描述业务规则 ...

  9. 连载:阿里巴巴大数据实践—数据建模综述

    简介:数据模型就是数据组织和存储方法,它强调从业务.数据存取和使用角度合理存储数据. 前言: -更多关于数智化转型.数据中台内容请加入阿里云数据中台交流群-数智俱乐部 和关注官方微信公总号(文末扫描二 ...

最新文章

  1. C语言 字符串和字符串数组动态分配及赋值
  2. 基于SSM实现新闻推荐系统
  3. 从架构演进的角度聊聊Spring Cloud都做了些什么?
  4. 计算机操作业务知识题库,《计算机操作基础知识题库》.doc
  5. 1.4激活函数-带隐层的神经网络tf实战
  6. 网站访问优化,未完待续
  7. cp命令显示进度条_干货|| Linux常用命令大全
  8. 【转】应聘时最漂亮的回答
  9. javascript 请求web service
  10. 爬楼梯算法的数学思路
  11. idea git Untracked Files Prevent Pull
  12. dvi线支持多少分辨率_dvi接口有哪几种_dvi支持最大分辨率
  13. 1919: 三个整数排序(指针专题)
  14. 三极管发射极偏置原理应用于LED驱动电路的分析
  15. java23种设计模式面试常被问到的单利模式讲解
  16. 1165.穹妹的求助
  17. 大学生数码装备推荐,2022年值得入手的数码好物
  18. Release版本发行说明
  19. OpenCV C++案例实战十八《抖音特效——“蓝线挑战”》
  20. mongodb mysql配置_Mongodb 配置

热门文章

  1. 面向对象的一个实例 (银行管理系统)
  2. ks检验正态分布结果_统计学里的数据正态性检验
  3. c++ 类中静态变量 static
  4. 电脑编程教学_河东CNC产品零件编程培训量身定制课程大纲
  5. 强化学习笔记 experience replay 经验回放
  6. 文巾解题 面试题 01.06. 字符串压缩
  7. 线性代数笔记:Hadamard积
  8. 机器学习笔记:logistic regression
  9. R语言问题剖析20篇(一)-R语言泛函式编程purrr实现优雅循环迭代
  10. mapreduce编程实例(2)-求最大值和最小值