記住關(guān)系型數(shù)據(jù)庫設(shè)計要領(lǐng)就夠了!
不點藍(lán)字關(guān)注,我們哪來故事?
摘要
實體-關(guān)系模型(E-R)
實體:實體是世界中可以區(qū)別于其他對象的“事件”或者“物體”,例如,學(xué)校里的每個學(xué)生、學(xué)生選修的每門課程等都是一個實體。屬性:屬性是實體集中每個成員具有的描述性性質(zhì)。例如,學(xué)生的姓名,學(xué)號等。實體集:實體集就是就有相同類型及屬性的實體集合,比如,學(xué)校里的所有學(xué)生,學(xué)生選修的所有課程等。關(guān)系:關(guān)系是多個實體間的相互關(guān)聯(lián)。例如,小明選修語文課程。關(guān)系集:關(guān)系集是同類關(guān)系的集合。例如,所用學(xué)生選修課程的集合。

關(guān)系表設(shè)計
Boyce-Codd范式
α→β 是平凡函數(shù)依賴(即 β ? α)。(一般來說,平凡函數(shù)依賴并沒有討論意義,討論的都是非平凡函數(shù)依賴,即 β ?? α 的情況) α 是模式R的超碼。
學(xué)生 = (學(xué)號,姓名,年齡,性別)
課程 = (課程號,課程名,學(xué)分)
選修 = (學(xué)號,課程號,成績)
banker-name → branch-name branch-name customer-name → banker-name
第三范式
BCNF。 無損連接。 保持函數(shù)依賴。
α→β 是平凡函數(shù)依賴(即 β ? α)。 α 是模式R的超碼。 β - α 中的每個屬性 A 都包含在R的候選碼中。
每個BCNF都屬于3NF,因為BCNF的約束比3NF更嚴(yán)格。
存儲引擎的選擇

MyISAM:MySQL 5.5.5以前,MyISAM作為MySQL的默認(rèn)存儲引擎。 InnoDB:MySQL 5.5.5以后,InnoDB作為MySQL的默認(rèn)存儲引擎。
何如選擇?
InnoDB和非InnoDB存儲引擎的組合對比,僅使用InnoDB存儲引擎可以簡化備份和恢復(fù)操作。MySQL Enterprise Backup對使用InnoDB存儲引擎的所有表進行熱備份。對于使用MyISAM或其他非InnoDB存儲引擎的表,它會執(zhí)行“熱”備份,數(shù)據(jù)庫會繼續(xù)運行,但這些表在備份時不能修改。
InnoDB:事務(wù)型業(yè)務(wù)場景首選。 MyISAM:非事務(wù)型的大多數(shù)業(yè)務(wù)場景。 Memory:數(shù)據(jù)保存到內(nèi)存中,能提供極速的訪問速度。(個人覺得可以使用Redis等NoSQL數(shù)據(jù)庫代替)
字符集選擇
如何選擇?
數(shù)據(jù)類型的選擇
選擇原則
固定長度和可變長度

mysql>?CREATE?TABLE?vc?(v?VARCHAR(4),?c?CHAR(4));
Query?OK,?0?rows?affected?(0.01?sec)
mysql>?INSERT?INTO?vc?VALUES?('ab??',?'ab??');
Query?OK,?1?row?affected?(0.00?sec)
mysql>?SELECT?CONCAT('(',?v,?')'),?CONCAT('(',?c,?')')?FROM?vc;
+---------------------+---------------------+
|?CONCAT('(',?v,?')')?|?CONCAT('(',?c,?')')?|
+---------------------+---------------------+
|?(ab??)??????????????|?(ab)????????????????|
+---------------------+---------------------+
1?row?in?set?(0.06?sec)
執(zhí)行大量的刪除和更新操作后,會留下很”空洞“,需要定期optimize table進行碎片整理; 避免查詢大型的text和blob。查詢大型的text和blob會使一頁能裝下的數(shù)據(jù)量減少,增加磁盤I/O壓力。 把text和blob分離到單獨的表中。這會把原來表中的數(shù)據(jù)列轉(zhuǎn)變?yōu)楦痰墓潭ㄩL度的數(shù)據(jù)行格式,這個十分有用。
浮點數(shù)和定點數(shù)
友情提醒:在有關(guān)金錢交易方面浮點數(shù)慎用?。?!
整數(shù)

索引設(shè)計
設(shè)計原則
搜索的索引列,不一定是所要選擇的列。最適合索引的列是出現(xiàn)在 WHERE 子 句中的列,或連接子句中指定的列,而不是出現(xiàn)在 SELECT 關(guān)鍵字后的選擇列表中的列。 使用惟一索引。對于惟一值的列,索引的效果最好,而具有多個 重復(fù)值的列,其索引效果最差。 使用短索引。如果對字符串列進行索引,應(yīng)該指定一個前綴長度 。例如,如果有一個 CHAR(200) 列,如果在前 10 個或 20 個字符內(nèi),多數(shù)值是惟一的, 那么就不要對整個列進行索引。 利用最左前綴。每個額外的索 引都要占用額外的磁盤空間,并降低寫操作的性能。 不要過度索引。 考慮在列上進行的比較類型。如果是在列上做函數(shù)運算,對其進行索引將毫無意義。
示例



Student中姓名的長度是40,這里把外國人也考慮進來了;
Student中性別定義成枚舉,主要是枚舉意義簡明;
Student中沒有存年齡,而存儲的出生日期,是因為年齡并不是一成不變的,并且能夠通過出生日期正確計算。
SC中成績使用的是double而不采用decimal,主要是因為成績并不需要那么高的精確度。
SC中(sno,cno)作為聯(lián)合主鍵而不是獨立主鍵,由于現(xiàn)階段markdown無法合拼行,所以無法編輯。

推薦


評論
圖片
表情

