本文主要研究一下mysql如何用一個列來存儲多個值
創新互聯建站長期為成百上千客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為黔西南州企業提供專業的成都網站建設、成都做網站,黔西南州網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發。
mysql用單列存儲多值通常用于一對多的反范式處理,具體可以用bit、int/bigint、varchar、set類型來實現,缺點是不支持索引。
MySQL里面有如下的表
user:id username
photo:id name
photo_favour(圖片收藏關系表):photo_id user_id
假設這幾個表都相當大,需要進行分表。我的分表規則是:
user表按照id取模,這樣user相關的表都可以按照這個取模后的結果來分表;
photo表按照id取模,同樣與photo相關的表都可以按該規則分表;
至于photo_favour是一個多對多的關系表,我現在的想法是該表復制多一份,一份以photo_id來分表,一份以user_id分表,分別建立不同的索引,這樣就變為兩個一對多的關系。
我有兩個問題:
1、這樣的分表可行嗎,有更好的分表方法嗎?
2、一對多的關系在進行分表時候,例如user表和user_favour表都按照user_id來取模得到序號x來確定分表。如果1個用戶會有100條收藏記錄,那么user_x有100W條記錄時候user_favour_x分表就有1000W記錄,這時候user_favour_x又需要分表了,怎么解決這種情況?
這種情況我會放棄多對多的形式,弄兩個表
user_to_photos: user_id, photo_id_list
photo_to_users: photo_id, user_id_list
1個user喜歡的photo id全塞到photo_id_list
1個photo被哪些用戶喜歡了,也全塞到user_id_list
這樣的讀取就高效了很多,,寫的時候注意并發臟寫。。。同樣你根據user_id愛怎么分表就怎么分。
===
如果收藏量太大,還是不能滿足,就要考慮切分記錄,1個user可以擁有多條記錄,每條記錄都可記錄多個photo id
user_to_photos: user_id, num, photo_id_list
num字段可有可無,如果你需要精確定位user 222 收藏的 photo 333在哪條記錄,就需要安排好算法,找到對應的num
大概是這樣,重點是算法邏輯
數據庫中建表時經常所說一對一、一對多、多對多等等關系究竟是什么意思?分別在什么情況下要用到一對一或一對式,而又在什么情況下又要用到多對多?在這里我們詳細分析,并且用實例來講解各種關系的實際運用!
關聯映射:一對多/多對一存在最普遍的映射關系,簡單來講就如球員與球隊的關系;一對多:從球隊角度來說一個球隊擁有多個球員 即為一對多多對一:從球員角度來說多個球員屬于一個球隊 即為多對一數據表間一對多關系如下圖:
關聯映射:一對一關系就如球隊與球隊所在地址之間的關系,一支球隊僅有一個地址,而一個地址區也僅有一支球隊。數據表間一對一關系的表現有兩種,一種是外鍵關聯,一種是主鍵關聯。圖示如下:
一對一外鍵關聯:
----------------------------------------------------------------------------------------------------------
前言:多對多關系至少需要3個表,我們把一個表叫做主表,一個叫做關系表,另外一個叫做字典表或者副表(字典表是紀錄比較少,而且基本穩定的,例如:版塊名稱;副表是內容比較多,內容變化的,例如)。
按照數據庫的增刪查改操作,多對多關系的查找都可以用inner join或者
select * from 主表 where id in (select 主表id from 關系表)
1,角色任命型
特點:關系表兩外鍵組合無重復紀錄,關系表一般不需要時間字段和主鍵,有一個表是字典類型的表。
界面特點:顯示主表,用checkbox或多選select設置多選關系。
例如:任命版主(用戶表-關系表-版塊名稱表),角色權限控制等,用戶是5個版塊版主,只要關系表5行紀錄就可以確立,關系表的兩個外鍵具有聯合主鍵性質。
增加關系:如果沒有組合紀錄,insert之。
刪除關系:如果有組合紀錄,刪除之。
2,集合分組型
特點:同角色任命型類似,關系表兩外鍵組合無重復紀錄,關系表一般不需要時間字段和主鍵。區別是主副表都不是字典表,可能都很大不固定。
界面特點:顯示主表,用搜索代替簡單的checkbox或多選select,或者一條一條的添加。
例如:歌曲專集(專集表-關系表-歌曲表)。手機分組(分組表-關系表-手機表)。用戶圈子(圈子表-關系表-用戶表)。文章標簽(文章表-關系表-標簽表)
增加關系:同版主任命型。
刪除關系:同版主任命型。
3,明細帳型
特點:關系表可以有重復紀錄,關系表一般有時間字段,有主鍵,可能還有文字型的字段用來說明每次發生關系的原因(消費)。
界面特點:顯示關系表,用radio或下拉設置單選關系。
例如:現金消費明細帳或訂單(用戶表-訂單表-消費原因表),用戶可能多次在同一事情上重復消費。積分變化紀錄也屬于這類。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間。
刪除關系:根據關系表PK刪除。
4,評論回復型
特點:同明細帳型關系表一般有時間字段,有主鍵,區別是重點在文字型的字段用來說明每次發生關系的內容(評論回復)。
界面特點:回復文本框。
例如:論壇回復(用戶表-回復表-帖子表),用戶可能多次在不同帖子上評論回復費。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間和文字。
刪除關系:根據關系表(回復表)PK刪除。
5,站內短信型
特點:主副表是同一個,關系表一般有時間字段,有主鍵,重點在關系表文字型的字段用來說明每次發生關系的內容(消息)或者其他標記位來表示文字已讀狀態時間等。
界面特點:回復文本框。
例如:站內短信(用戶表-短信表-用戶表),用戶可能給用戶群發或者單發,有標記位來表示文字已讀狀態時間等。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間和文字。
刪除關系:根據關系表(回復表)PK刪除。
6,用戶好友型
特點:主副表是同一個,同集合分組型,關系表兩外鍵組合無重復紀錄,關系表一般不需要時間字段和主鍵。
界面特點:同集合分組型,顯示主表,用搜索代替簡單的checkbox或多選select,或者一條一條的添加。
例如:下載站點的文件,(文件表-關系表-文件表)可以被軟件工具打開,軟件工具本身也是一種文件,可以被下載。用戶的好友,也是用戶(用戶表-好友關系表-用戶表)
增加關系:同版主任命型。
刪除關系:同版主任命型。
7,未知屬性型
特點:在設計初期,主表的某些字段類型和名稱是不確定的時候,關系表實際上是主表的可擴展字段,
一個[主表](ID),
一個[屬性名稱表](屬性ID.屬性名稱),
一個[屬性值表],包括3個字段:
屬性值(屬性Value varchar(500))
主表ID
屬性ID
這樣可以作到最小冗余度。
(和常見的多對多關系不同的是:值統一用varchar來存儲,因為這類型的值一般不會用來計算)。
比如:
軍隊的數據庫設計中有種物資叫做“戰繳物資”,就是打仗的時候繳獲的,軍隊自己都不知道這些物資有什么屬性。
比如繳獲的化學品有化學名,通用名,是否有輻射,計量單位,包裝規格,數量等等,或者不是化學品是其他任何未知的東西。
這樣東西就可以
某奇怪東西.屬性集合["某某奇怪屬性名"]="某某奇怪值";
某變態東西.屬性集合["某某變態屬性名"]="某某變態值";
這樣存儲。
再比如:
手機型號有幾千種,除了共同屬性外還有不同屬性有幾百個,屬性名和值類型都不一樣,有的手機有這屬性,有的沒有。
對于這樣的“多態”,我們就采用上面的設計結構。
其效果相當于:
某奇怪手機.屬性集合["某某奇怪屬性名"]="某某奇怪值";
某變態手機.屬性集合["某某變態屬性名"]="某某變態值";
界面特點:設置主表一行紀錄的屬性時候,要列出所有可能的屬性名稱,每個對應一個文本框。
拿用戶角色來說
用戶? ←多對多→ 角色
概念模型如下:
生成物理模型就成了2個1對多:
箭頭指向多的一方
在多的一方增加 一 的一方的id,例如 A 有 n 個好友,則在好友表(friends)中,增加一個字段用于存放A的id,則可以通過下列語句查詢到A的所有好友:
select * from friends where Aid = ?
分享標題:mysql怎么存放一對多 mysql多對一查詢
網頁URL:http://vcdvsql.cn/article44/doodihe.html
成都網站建設公司_創新互聯,為您提供全網營銷推廣、搜索引擎優化、ChatGPT、品牌網站設計、外貿網站建設、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯