白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联
文章目錄
- 概述
- 關(guān)系型與document類型數(shù)據(jù)模型對(duì)比
- 關(guān)系型數(shù)據(jù)庫
- 應(yīng)用Model
- es文檔數(shù)據(jù)模型
- 建模方式一:通過應(yīng)用層join實(shí)現(xiàn)用戶與博客的關(guān)聯(lián)
- 構(gòu)造用戶與博客數(shù)據(jù)
- 搜索某個(gè)用戶發(fā)表的所有博客
- 優(yōu)缺點(diǎn)
- 建模方式二:通過數(shù)據(jù)冗余實(shí)現(xiàn)用戶與博客的關(guān)聯(lián)
- 構(gòu)造用戶與博客數(shù)據(jù)
- 搜索某個(gè)用戶發(fā)表的所有博客
- 優(yōu)點(diǎn)和缺點(diǎn)
概述
繼續(xù)跟中華石杉老師學(xué)習(xí)ES,第54篇
課程地址: https://www.roncoo.com/view/55
關(guān)系型與document類型數(shù)據(jù)模型對(duì)比
舉個(gè)例子: 部門和員工 ,1個(gè)部門下可以有N多個(gè)員工 ,部門:員工 = 1:N 1對(duì)多的關(guān)系。
關(guān)系型數(shù)據(jù)庫
部門Department 表
dept_id name desc員工Employee 表 (通過dept_id關(guān)聯(lián)到所屬的部門)
emp_id name age gender dept_id數(shù)據(jù)庫的設(shè)計(jì)還是遵循了三范式:將每個(gè)數(shù)據(jù)實(shí)體拆分為一個(gè)獨(dú)立的數(shù)據(jù)表,同時(shí)使用主外鍵關(guān)聯(lián)關(guān)系將多個(gè)數(shù)據(jù)表關(guān)聯(lián)起來 , 確保沒有任何冗余的數(shù)據(jù) .
一份數(shù)據(jù),只會(huì)放在一個(gè)數(shù)據(jù)表中,比如dept name,部門名稱,就只會(huì)放在department表中,不會(huì)在employee表中也放一個(gè)dept name,如果說你要查看某個(gè)員工的部門名稱,那么必須通過員工表中的外鍵,dept_id,找到在部門表中對(duì)應(yīng)的記錄,然后找到部門名稱 。
應(yīng)用Model
/** * 部門 **/ public class Department {private Integer deptId;private String name;private String desc;// 部門中存放一個(gè) 員工的集合 private List<Employee> employees;}/** * 員工 **/ public class Employee {private Integer empId;private String name;private Integer age;private String gender;// 所在部門private Department dept;}es文檔數(shù)據(jù)模型
{"deptId": "1","name": "研發(fā)部門","desc": "負(fù)責(zé)公司的所有研發(fā)項(xiàng)目","employees": [{"empId": "1","name": "張三","age": 28,"gender": "男"},{"empId": "2","name": "王蘭","age": 25,"gender": "女"},{"empId": "3","name": "李四","age": 34,"gender": "男"}] }es更加類似于面向?qū)ο蟮臄?shù)據(jù)模型,將所有由關(guān)聯(lián)關(guān)系的數(shù)據(jù),放在一個(gè)doc json類型數(shù)據(jù)中,整個(gè)數(shù)據(jù)的關(guān)系,還有完整的數(shù)據(jù),都放在了一起.
建模方式一:通過應(yīng)用層join實(shí)現(xiàn)用戶與博客的關(guān)聯(lián)
構(gòu)造用戶與博客數(shù)據(jù)
# 讓ES自動(dòng)創(chuàng)建 users索引,并寫入一條數(shù)據(jù) PUT /users/users/1 {"name": "小工匠","email": "artisan@artisan.com","birthday": "2000-01-01" }#讓ES自動(dòng)創(chuàng)建 blogs ,并寫入一條數(shù)據(jù) PUT /blogs/blogs/1 {"title": "跟石杉老師學(xué)ES","content": "數(shù)據(jù)建模之通過【應(yīng)用層join】或者【數(shù)據(jù)冗余】實(shí)現(xiàn)實(shí)現(xiàn)用戶與博客的關(guān)聯(lián)","userId": 1 }搜索某個(gè)用戶發(fā)表的所有博客
# 第一次搜索 查詢name為 小工匠的用戶 (這里需要name.keyword 不分詞查詢) GET /users/users/_search {"query": {"term": {"name.keyword": {"value": "小工匠"}}} } # 第二次搜索,要放入terms中userId GET /blogs/blogs/_search {"query": {"bool": {"filter": {"terms": {"userId": [1]}}}} }假設(shè)搜索的是,1萬個(gè)用戶的博客,可能第一次搜索,會(huì)得到1萬個(gè)userId , 第二次搜索的時(shí)候,要放入terms中1萬個(gè)userId,才能進(jìn)行搜索,這個(gè)時(shí)候性能比較差了 。
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):數(shù)據(jù)不冗余,維護(hù)方便
- 缺點(diǎn):應(yīng)用層join,如果關(guān)聯(lián)數(shù)據(jù)過多,導(dǎo)致查詢過大,性能很差
建模方式二:通過數(shù)據(jù)冗余實(shí)現(xiàn)用戶與博客的關(guān)聯(lián)
第二種建模方式:用冗余數(shù)據(jù),采用文檔數(shù)據(jù)模型,進(jìn)行數(shù)據(jù)建模,實(shí)現(xiàn)用戶和博客的關(guān)聯(lián), 在ES的應(yīng)用中,推薦這種方式建模。
構(gòu)造用戶與博客數(shù)據(jù)
# 讓ES自動(dòng)創(chuàng)建 users2索引,并寫入一條數(shù)據(jù) PUT /users2/users2/1 {"name": "小工匠","email": "artisan@artisan.com","birthday": "2000-01-01" }#讓ES自動(dòng)創(chuàng)建 blogs2 ,并寫入一條數(shù)據(jù) PUT /blogs2/blogs2/1 {"title": "跟石杉老師學(xué)ES","content": "數(shù)據(jù)建模之通過【應(yīng)用層join】或者【數(shù)據(jù)冗余】實(shí)現(xiàn)實(shí)現(xiàn)用戶與博客的關(guān)聯(lián)","userInfo": {"userId": 1,"username": "小工匠"} }冗余數(shù)據(jù)就是說將可能會(huì)進(jìn)行搜索的條件和要搜索的數(shù)據(jù),放在一個(gè)doc中
搜索某個(gè)用戶發(fā)表的所有博客
GET /blogs2/blogs2/_search {"query": {"term": {"userInfo.username.keyword": {"value": "小工匠"}}} }可以看到不需要走應(yīng)用層的join,先搜一個(gè)數(shù)據(jù),找到id,再去搜另一份數(shù)據(jù),直接走一個(gè)有冗余數(shù)據(jù)的type即可,指定要的搜索條件,即可搜索出自己想要的數(shù)據(jù)來。
優(yōu)點(diǎn)和缺點(diǎn)
- 優(yōu)點(diǎn):性能高,不需要執(zhí)行兩次搜索
- 缺點(diǎn):數(shù)據(jù)冗余,維護(hù)成本高 ,每次username變化了,同時(shí)要更新user type和blog type
一般來說,對(duì)于es這種NoSQL類型的數(shù)據(jù)存儲(chǔ)來講,都是冗余模式…
當(dāng)然,我們要去維護(hù)數(shù)據(jù)的關(guān)聯(lián)關(guān)系,也是很有必要的,所以一旦出現(xiàn)冗余數(shù)據(jù)的修改,必須記得將所有關(guān)聯(lián)的數(shù)據(jù)全部更新。
總結(jié)
以上是生活随笔為你收集整理的白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白话Elasticsearch53-深入
- 下一篇: 白话Elasticsearch55-数据