主鍵和外鍵有什么區(qū)別?
主鍵 :用于唯一標(biāo)識(shí)一條數(shù)據(jù)踢械,值不能為null奸晴、不允許有重復(fù)。一張表只能有一個(gè)主鍵列监署,如果建表沒(méi)有設(shè)置主鍵颤专,首先會(huì)選擇非空唯一索引作為主鍵,如果沒(méi)有合適的索引列會(huì)生成一個(gè)不可見(jiàn)的列作為主鍵钠乏。
外鍵 :外鍵用來(lái)和其他表建立聯(lián)系用栖秕,外鍵是另一表的主鍵,外鍵是可以有重復(fù)的晓避,可以是空值簇捍。一個(gè)表可以有多個(gè)外鍵。
為什么不推薦使用外鍵與級(jí)聯(lián)俏拱?
外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā)暑塑,不適合分布式、高并發(fā)集群锅必。
級(jí)聯(lián)更新是強(qiáng)阻塞事格,存在數(shù)據(jù)庫(kù)更新風(fēng)暴的風(fēng)險(xiǎn)。
外鍵影響數(shù)據(jù)庫(kù)的插入速度况毅。
對(duì)分庫(kù)分表不友好, 因?yàn)榉謳?kù)分表下外鍵是無(wú)法生效分蓖。
外鍵與級(jí)聯(lián)的優(yōu)點(diǎn)?
保證了數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性和完整性尔许。
什么是 ER 圖么鹤?
E-R 圖 也稱(chēng)實(shí)體-聯(lián)系圖(Entity Relationship Diagram)。
提供了表示實(shí)體類(lèi)型味廊、屬性和聯(lián)系的方法蒸甜。
用來(lái)描述現(xiàn)實(shí)世界的概念模型。
是表示概念關(guān)系模型的一種方式余佛。
什么是范式柠新?
數(shù)據(jù)庫(kù)設(shè)計(jì)范式是數(shù)據(jù)庫(kù)設(shè)計(jì)的一系列原理和技術(shù),也是數(shù)據(jù)庫(kù)設(shè)計(jì)的規(guī)范辉巡,用于減少數(shù)據(jù)庫(kù)中數(shù)據(jù)冗余恨憎,增進(jìn)數(shù)據(jù)的一致性。
數(shù)據(jù)庫(kù)三范式介紹郊楣?
無(wú)范式(非標(biāo)準(zhǔn)化形式):規(guī)定了數(shù)據(jù)必須要有主鍵憔恳,且沒(méi)有重復(fù)的記錄。
1NF(第一范式):在無(wú)范式的基礎(chǔ)上净蚤,即也滿(mǎn)足必須有主鍵钥组,且沒(méi)有重復(fù)的記錄的基礎(chǔ)上,還有滿(mǎn)足字段的原子性今瀑。例子:加入date列里存放了兩個(gè)日期程梦,則不滿(mǎn)足第一范式点把。
2NF(第二范式):在第一范式的基礎(chǔ)上,沒(méi)有部分函數(shù)依賴(lài)屿附,及每條數(shù)據(jù)的值都依賴(lài)于這條數(shù)據(jù)的主鍵郎逃。
3NF(第三范式):在第二范式的基礎(chǔ)上,沒(méi)有傳遞函數(shù)依賴(lài)拿撩,及不存在一條數(shù)據(jù)B列的值依賴(lài)A列的值衣厘,C列的值依賴(lài)B列的值(A->B->C)
drop,delete與truncate的區(qū)別?
是否會(huì)刪除表結(jié)構(gòu):
- drop:直接刪除表數(shù)據(jù)和表結(jié)構(gòu)压恒。
- truncate:刪除表中數(shù)據(jù),其中表結(jié)構(gòu)错邦、約束探赫、索引不變。新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的種子值(主鍵會(huì)重置)撬呢。
- delete:可以配合where條件使用伦吠,不會(huì)重置主鍵值,可以刪除視圖和表魂拦。drop只能刪除表毛仪。
是否記錄回滾日志:
- delete每次只刪除一行,且會(huì)記錄undo.log回滾日志芯勘,也會(huì)觸發(fā)觸發(fā)器箱靴。
- truncate不會(huì)記錄回滾日志,不會(huì)觸發(fā)觸發(fā)器荷愕,所以執(zhí)行速度更快衡怀。
是否釋放索引空間:
- delete操作不會(huì)減少索引空間,truncate會(huì)完全釋放索引空間安疗。
是否受事務(wù)控制:
- drop和 truncate 是DDL抛杨,操作立即生效。delete 是DML需要事務(wù)提交后才生效荐类。
- 有外鍵約束的表怖现,使用truncate是不受外鍵約束。
執(zhí)行速度:
- 執(zhí)行速度:drop -> truncate -> delete玉罐。
數(shù)據(jù)庫(kù)中如何存儲(chǔ)時(shí)間屈嗤?
- 不要使用字符串存儲(chǔ)時(shí)間,字符串占用的空間更大厌小,存儲(chǔ)的日期效率比較低(逐個(gè)字符進(jìn)行比對(duì))恢共,無(wú)法用日期相關(guān)的 API 進(jìn)行計(jì)算和比較。
- Datetime 和 Timestamp 之間我們通常都會(huì)首選 Timestamp:
- DateTime 類(lèi)型是時(shí)區(qū)無(wú)關(guān)璧亚。
- Timestamp 和時(shí)區(qū)有關(guān)讨韭。Timestamp 類(lèi)型字段的值會(huì)隨著服務(wù)器時(shí)區(qū)的變化而變化脂信,自動(dòng)換算成相應(yīng)的時(shí)間,簡(jiǎn)單說(shuō)就是在不同時(shí)區(qū)透硝,查詢(xún)到同一個(gè)條記錄此字段的值會(huì)不一樣狰闪。
- DateTime 類(lèi)型耗費(fèi)空間更大,DateTime需要8個(gè)字節(jié)濒生,Timestamp 只需要使用 4 個(gè)字節(jié)埋泵,但是能表示更大的時(shí)間范圍:
- DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- Timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
- 數(shù)值型時(shí)間戳是更好的選擇嗎?
- int 或者 bigint 類(lèi)型的數(shù)值存儲(chǔ)方式具有 Timestamp 類(lèi)型的所具有一些優(yōu)點(diǎn)罪治,并且使用它的進(jìn)行日期排序以及對(duì)比等操作的效率會(huì)更高丽声,跨系統(tǒng)也很方便,因?yàn)橹皇谴娣诺臄?shù)值觉义。缺點(diǎn)是數(shù)據(jù)的可讀性太差雁社,無(wú)法直觀(guān)的看到具體時(shí)間。