mysql一列多值多屬性設計-亂穿馬路
亂穿馬路
需求:每個產品都可能有多個聯絡人
簡單方案:將單值儲存改為逗號分隔儲存多值
常用逗號分隔的列表來避免在多對多關係中建立交叉表,這是一種反模式,稱為亂穿馬路(Jaywalking),因為可以避免十字路口
目標:儲存多值屬性
如何在一列中儲存一系列相關資料的集合
一個賬號對應多個產品
每個產品對應一個聯絡人
但每個產品可能對應多個聯絡人
反模式:格式化的逗號分隔列表
查詢指定賬號的產品
查詢異常困難,不能再用等號
不得不借助模式匹配
困難出錯且無法帶來效能的優勢
查詢指定產品的賬號
多表連線也不合適
執行聚合查詢
很糟糕
缺陷:
- 困難出錯且無法帶來效能的優勢
- 多表連線也不合適
- 聚合查詢很糟糕
- 更新過於麻煩
- 驗證麻煩
- 選擇合適的分隔符,儲存的是字串使用逗號就不合適,甚至使用任何可能出現的新字元都不合適
- 列表長度限制
識別
- 列表最多支援存放多少資料
- 如何分詞查詢
- 哪個字元不會出現在任何一個列表中
合理使用
可能會需要,也可能沒必要使用這樣的單獨項。如果資料來源是這樣的值,並且只做儲存不做修改就每必要分開。
謹慎使用,儘可能用規範化的,更加靈活可變
解決方案:建立一張交叉表
將account_id儲存在單獨的一張表中而不是products表,每個獨立的account_id都可佔據一行
展現了products和accounts的多對多
問題解決:
-
通過賬號查詢產品和反查,使用連線查詢,由於能使用索引更加高效,且更加簡單
select p.* from products as p join constracts as c on(p.product_id = c.product_id) where c.account = 34;
-
聚合查詢
select product_id,count(*) from constracts group by product_id
-
更新指定產品的相關聯絡人
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-y5aAQhmV-1608896591993)(亂穿馬路.assets/image-20201221214154487.png)]
-
驗證產品id
約束資料型別
-
不用分隔符
-
沒有長度限制
-
用到索引,效率更改,新增額外屬性,比如記錄一個聯絡人被加入產品的具體日期,或產品的第一、第二聯絡人
區域被新增到活動的日期,活動的主要區域、次級區域等
每個值都應該儲存在各自的行與列中。
建立交叉表
相關文章
- 從屬性剋制延伸而來的多屬性隊伍養成設計
- Python - 物件導向程式設計 - 公共屬性、保護屬性、私有屬性Python物件程式設計
- 獲取List集合物件中某一列屬性值物件
- mysql json陣列內物件屬性 多個值搜尋MySqlJSON陣列物件
- 電商產品設計:商品的基本屬性與銷售屬性
- 計算屬性
- 單點養成與多點養成:GBF的多屬性隊伍養成設計分析
- 詳情屬性圖示設計參考
- 聊聊mysql的單列多值儲存MySql
- jQuery設定disabled屬性與移除disabled屬性jQuery
- 表屬性設定
- SuperObject Delphi 的 JSON 屬性亂序 – 操作類改造 – 關於屬性順序的問題ObjectJSON
- 好程式設計師分享placeholder屬性詳解程式設計師
- ArcMap屬性表出現亂碼情況的解決
- w10網路設定屬性打不開怎麼辦_win10網路設定屬性無法開啟如何修復Win10
- AppTheme屬性設定集合APP
- Cookie設定HttpOnly屬性CookieHTTP
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- Java程式設計筆記,springboot常用屬性彙總Java程式設計筆記Spring Boot
- 裝備屬性欄位設計和投放詳解
- Vue的計算屬性Vue
- Xcode設定自己的個性屬性XCode
- C#反射設定屬性值和獲取屬性值C#反射
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- oracle一列拆分為多列Oracle
- win10怎麼更改網路屬性_要如何更改網路屬性windows10Win10Windows
- MySQL:RR分析死鎖一列MySql
- vue計算屬性和vue實力的屬性和方法Vue
- PostgreSQL多值列的選擇性-Statistics,Cardinality,Selectivity,EstimateSQL
- Qt編寫自定義控制元件屬性設計器QT控制元件
- 行內元素屬性設定
- Echarts中Option屬性設定Echarts
- 執行緒屬性設定執行緒
- CMake 屬性之全域性屬性
- vue3計算屬性的可寫屬性 set 與 getVue
- Vue 計算屬性與方法Vue
- Vue(5)計算屬性computedVue
- MySQL:RR模式下死鎖一列MySql模式