MySQL里面有如下的表
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網(wǎng)站制作、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的大足網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
user:id username
photo:id name
photo_favour(圖片收藏關系表):photo_id user_id
假設這幾個表都相當大,需要進行分表。我的分表規(guī)則是:
user表按照id取模,這樣user相關的表都可以按照這個取模后的結果來分表;
photo表按照id取模,同樣與photo相關的表都可以按該規(guī)則分表;
至于photo_favour是一個多對多的關系表,我現(xiàn)在的想法是該表復制多一份,一份以photo_id來分表,一份以user_id分表,分別建立不同的索引,這樣就變?yōu)閮蓚€一對多的關系。
我有兩個問題:
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
這樣的讀取就高效了很多,,寫的時候注意并發(fā)臟寫。。。同樣你根據(jù)user_id愛怎么分表就怎么分。
===
如果收藏量太大,還是不能滿足,就要考慮切分記錄,1個user可以擁有多條記錄,每條記錄都可記錄多個photo id
user_to_photos: user_id, num, photo_id_list
num字段可有可無,如果你需要精確定位user 222 收藏的 photo 333在哪條記錄,就需要安排好算法,找到對應的num
大概是這樣,重點是算法邏輯
數(shù)據(jù)庫中建表時經(jīng)常所說一對一、一對多、多對多等等關系究竟是什么意思?分別在什么情況下要用到一對一或一對式,而又在什么情況下又要用到多對多?在這里我們詳細分析,并且用實例來講解各種關系的實際運用!
關聯(lián)映射:一對多/多對一存在最普遍的映射關系,簡單來講就如球員與球隊的關系;一對多:從球隊角度來說一個球隊擁有多個球員 即為一對多多對一:從球員角度來說多個球員屬于一個球隊 即為多對一數(shù)據(jù)表間一對多關系如下圖:
關聯(lián)映射:一對一關系就如球隊與球隊所在地址之間的關系,一支球隊僅有一個地址,而一個地址區(qū)也僅有一支球隊。數(shù)據(jù)表間一對一關系的表現(xiàn)有兩種,一種是外鍵關聯(lián),一種是主鍵關聯(lián)。圖示如下:
一對一外鍵關聯(lián):
----------------------------------------------------------------------------------------------------------
前言:多對多關系至少需要3個表,我們把一個表叫做主表,一個叫做關系表,另外一個叫做字典表或者副表(字典表是紀錄比較少,而且基本穩(wěn)定的,例如:版塊名稱;副表是內(nèi)容比較多,內(nèi)容變化的,例如)。
按照數(shù)據(jù)庫的增刪查改操作,多對多關系的查找都可以用inner join或者
select * from 主表 where id in (select 主表id from 關系表)
1,角色任命型
特點:關系表兩外鍵組合無重復紀錄,關系表一般不需要時間字段和主鍵,有一個表是字典類型的表。
界面特點:顯示主表,用checkbox或多選select設置多選關系。
例如:任命版主(用戶表-關系表-版塊名稱表),角色權限控制等,用戶是5個版塊版主,只要關系表5行紀錄就可以確立,關系表的兩個外鍵具有聯(lián)合主鍵性質。
增加關系:如果沒有組合紀錄,insert之。
刪除關系:如果有組合紀錄,刪除之。
2,集合分組型
特點:同角色任命型類似,關系表兩外鍵組合無重復紀錄,關系表一般不需要時間字段和主鍵。區(qū)別是主副表都不是字典表,可能都很大不固定。
界面特點:顯示主表,用搜索代替簡單的checkbox或多選select,或者一條一條的添加。
例如:歌曲專集(專集表-關系表-歌曲表)。手機分組(分組表-關系表-手機表)。用戶圈子(圈子表-關系表-用戶表)。文章標簽(文章表-關系表-標簽表)
增加關系:同版主任命型。
刪除關系:同版主任命型。
3,明細帳型
特點:關系表可以有重復紀錄,關系表一般有時間字段,有主鍵,可能還有文字型的字段用來說明每次發(fā)生關系的原因(消費)。
界面特點:顯示關系表,用radio或下拉設置單選關系。
例如:現(xiàn)金消費明細帳或訂單(用戶表-訂單表-消費原因表),用戶可能多次在同一事情上重復消費。積分變化紀錄也屬于這類。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間。
刪除關系:根據(jù)關系表PK刪除。
4,評論回復型
特點:同明細帳型關系表一般有時間字段,有主鍵,區(qū)別是重點在文字型的字段用來說明每次發(fā)生關系的內(nèi)容(評論回復)。
界面特點:回復文本框。
例如:論壇回復(用戶表-回復表-帖子表),用戶可能多次在不同帖子上評論回復費。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間和文字。
刪除關系:根據(jù)關系表(回復表)PK刪除。
5,站內(nèi)短信型
特點:主副表是同一個,關系表一般有時間字段,有主鍵,重點在關系表文字型的字段用來說明每次發(fā)生關系的內(nèi)容(消息)或者其他標記位來表示文字已讀狀態(tài)時間等。
界面特點:回復文本框。
例如:站內(nèi)短信(用戶表-短信表-用戶表),用戶可能給用戶群發(fā)或者單發(fā),有標記位來表示文字已讀狀態(tài)時間等。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間和文字。
刪除關系:根據(jù)關系表(回復表)PK刪除。
6,用戶好友型
特點:主副表是同一個,同集合分組型,關系表兩外鍵組合無重復紀錄,關系表一般不需要時間字段和主鍵。
界面特點:同集合分組型,顯示主表,用搜索代替簡單的checkbox或多選select,或者一條一條的添加。
例如:下載站點的文件,(文件表-關系表-文件表)可以被軟件工具打開,軟件工具本身也是一種文件,可以被下載。用戶的好友,也是用戶(用戶表-好友關系表-用戶表)
增加關系:同版主任命型。
刪除關系:同版主任命型。
7,未知屬性型
特點:在設計初期,主表的某些字段類型和名稱是不確定的時候,關系表實際上是主表的可擴展字段,
一個[主表](ID),
一個[屬性名稱表](屬性ID.屬性名稱),
一個[屬性值表],包括3個字段:
屬性值(屬性Value varchar(500))
主表ID
屬性ID
這樣可以作到最小冗余度。
(和常見的多對多關系不同的是:值統(tǒng)一用varchar來存儲,因為這類型的值一般不會用來計算)。
比如:
軍隊的數(shù)據(jù)庫設計中有種物資叫做“戰(zhàn)繳物資”,就是打仗的時候繳獲的,軍隊自己都不知道這些物資有什么屬性。
比如繳獲的化學品有化學名,通用名,是否有輻射,計量單位,包裝規(guī)格,數(shù)量等等,或者不是化學品是其他任何未知的東西。
這樣東西就可以
某奇怪東西.屬性集合["某某奇怪屬性名"]="某某奇怪值";
某變態(tài)東西.屬性集合["某某變態(tài)屬性名"]="某某變態(tài)值";
這樣存儲。
再比如:
手機型號有幾千種,除了共同屬性外還有不同屬性有幾百個,屬性名和值類型都不一樣,有的手機有這屬性,有的沒有。
對于這樣的“多態(tài)”,我們就采用上面的設計結構。
其效果相當于:
某奇怪手機.屬性集合["某某奇怪屬性名"]="某某奇怪值";
某變態(tài)手機.屬性集合["某某變態(tài)屬性名"]="某某變態(tài)值";
界面特點:設置主表一行紀錄的屬性時候,要列出所有可能的屬性名稱,每個對應一個文本框。
1、首先打開mysql命令行編輯器。
2、打開之后輸入密碼,連接數(shù)據(jù)庫。
3、在命令行里先查看一下所有數(shù)據(jù)庫,是否有想要操作數(shù)據(jù)庫。
4、接著輸入指令“use?sss”使用想要創(chuàng)建表的數(shù)據(jù)庫。
5、接下來在表里面輸入數(shù)據(jù)列,使用create命令創(chuàng)建表,括號內(nèi)是表的類目名。
6、最后,輸入指令“show tables?”,就可以剛剛查看在數(shù)據(jù)庫中創(chuàng)建的表了。
方法如下:
1、首先打開Mysql命令行編輯器,連接Mysql數(shù)據(jù)庫;
2、使用所要操作的數(shù)據(jù)庫,先顯示一下數(shù)據(jù)庫中的表;
3、顯示一下表結構,了解一下表中的列;
4、向表插入數(shù)據(jù),insert into 表名 (列名) values (值);
5、查詢表可以看到所插入的數(shù)據(jù),select * from 表名;
6、可以再插入一個數(shù)據(jù),顯示一下。
擴展資料:
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于?Oracle?旗下產(chǎn)品。MySQL 是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應用方面,MySQL是最好的?RDBMS?(Relational Database Management System,關系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件。
MySQL是一種關系數(shù)據(jù)庫管理系統(tǒng),關系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。
由于其社區(qū)版的性能卓越,搭配?PHP?和?Apache?可組成良好的開發(fā)環(huán)境。
與其他的大型數(shù)據(jù)庫,例如?Oracle、DB2、SQL Server等相比,MySQL自有它的不足之處,但是這絲毫也沒有減少它受歡迎的程度。對于一般的個人使用者和中小型企業(yè)來說,MySQL提供的功能已經(jīng)綽綽有余,而且由于 MySQL是開放源碼軟件,因此可以大大降低總體擁有成本。
Linux作為操作系統(tǒng),Apache?或Nginx作為?Web?服務器,MySQL 作為數(shù)據(jù)庫,PHP/Perl/Python作為服務器端腳本解釋器。由于這四個軟件都是免費或開放源碼軟件(FLOSS),因此使用這種方式不用花一分錢(除開人工成本)就可以建立起一個穩(wěn)定、免費的網(wǎng)站系統(tǒng),被業(yè)界稱為“LAMP“或“LNMP”組合。
MyISAMMySQL 5.0 之前的默認數(shù)據(jù)庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務
InnoDB事務型數(shù)據(jù)庫的首選引擎,支持ACID事務,支持行級鎖定, MySQL 5.5 起成為默認數(shù)據(jù)庫引擎
BDB源 自 Berkeley DB,事務型數(shù)據(jù)庫的另一種選擇,支持Commit 和Rollback 等其他事務特性
Memory所有數(shù)據(jù)置于內(nèi)存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數(shù)據(jù)量成正比的內(nèi)存空間。并且其內(nèi)容會在 MySQL 重新啟動時丟失
Merge將一定數(shù)量的 MyISAM 表聯(lián)合而成一個整體,在超大規(guī)模數(shù)據(jù)存儲時很有用
Archive非常適合存儲大量的獨立的,作為歷史記錄的數(shù)據(jù)。因為它們不經(jīng)常被讀取。Archive 擁有高效的插入速度,但其對查詢的支持相對較差
Federated將不同的 MySQL 服務器聯(lián)合起來,邏輯上組成一個完整的數(shù)據(jù)庫。非常適合分布式應用
Cluster/NDB高冗余的存儲引擎,用多臺數(shù)據(jù)機器聯(lián)合提供服務以提高整體性能和安全性。適合數(shù)據(jù)量大,安全和性能要求高的應用
CSV: 邏輯上由逗號分割數(shù)據(jù)的存儲引擎。它會在數(shù)據(jù)庫子目錄里為每個數(shù)據(jù)表創(chuàng)建一個 .csv 文件。這是一種普通文本文件,每個數(shù)據(jù)行占用一個文本行。CSV 存儲引擎不支持索引。
BlackHole:黑洞引擎,寫入的任何數(shù)據(jù)都會消失,一般用于記錄 binlog 做復制的中繼
EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL?源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發(fā)者。EXAMPLE 存儲引擎不支持編索引。
另外,MySQL 的存儲引擎接口定義良好。有興趣的開發(fā)者可以通過閱讀文檔編寫自己的存儲引擎。
參考資料來源:百度百科:mySQL