數據庫設計)
數據庫設計就是根據業務規劃表、字段、表和表之間的關系。目標少存重復數據、數據不出錯、查詢速度夠用。一、4個核心設計目標減少數據冗余同樣的數據不要重復存多份避免改一處、別處沒同步保證數據完整不讓臟數據存入數據庫性能夠用查詢不要太慢方便后續改需求二、數據庫設計完整流程需求分析搞清楚系統里有哪些事物實體、它們有什么信息、事物之間有什么聯系。不要上來就寫建表SQL概念設計 ER模型實體現實對象例學生、課程屬性對象的信息例學生姓名、手機號關系一對一一個A對應一個B一對多一個A對應多個B最常用多對多A和B互相多對多必須新建中間表不能直接存逗號分割id邏輯設計把ER模型翻譯成表定主鍵、外鍵。物理設計寫SQL確定字段類型、約束、索引。維護迭代測試后續根據需求修改。三、三大范式范式是一套設計規范考試??奸_發中不用死板死守。1NF 第一范式原子性一個單元格只存一份信息不能把多個信息塞同一個字段。錯誤contact13800001111;zhangsanqq.com正確拆成手機號、郵箱兩個字段。2NF 第二范式消除部分依賴一張表盡量只描述一件事物。如果是聯合主鍵所有字段都要完整依賴全部主鍵。3NF 第三范式消除傳遞依賴表中字段不要間接推導出來。比如學生表不要寫學院名稱只存學院id學院名稱放在學院表。重點允許反范式。為查詢更快可以少量冗余字段但要自己保證數據同步。四、主鍵、外鍵零基礎要點主鍵PRIMARY KEY唯一標識一行優先使用AUTO_INCREMENT自增數字。不要拿手機號、身份證做主鍵業務信息會修改。外鍵FOREIGN KEY用來關聯兩張表。注意MySQL外鍵會降低性能。五、SQL示例多對多中間表是重點-- 學生表CREATETABLEstudent(stu_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT學生編號主鍵自增,stu_nameVARCHAR(32)NOTNULLCOMMENT學生姓名不能為空,phoneVARCHAR(16)UNIQUECOMMENT手機號不能重復)ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 課程表CREATETABLEcourse(course_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT課程編號,course_nameVARCHAR(64)NOTNULLCOMMENT課程名稱,creditTINYINTNOTNULLCOMMENT學分)ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 多對多中間表學生選課記錄學生選了什么課、分數CREATETABLEstu_course(idINTPRIMARYKEYAUTO_INCREMENT,stu_idINTNOTNULLCOMMENT關聯學生表主鍵,course_idINTNOTNULLCOMMENT關聯課程表主鍵,scoreDECIMAL(5,2)COMMENT考試分數,-- 作業考試可以寫外鍵約束FOREIGNKEY(stu_id)REFERENCESstudent(stu_id),FOREIGNKEY(course_id)REFERENCEScourse(course_id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;六、易踩坑點什么數據都塞一張大表里拿手機號、姓名這類業務字段當主鍵字段大量允許NULL盡量給默認值多對多圖省事用1,2,3字符串存id不建中間表無法做聯表查詢死磕三范式拆幾十張表查詢需要大量JOIN速度很慢字段類型選錯手機號用int開頭0丟失、時間存字符串小結做數據庫設計先想業務實體和關系再寫SQL。范式作為參考不是鐵律平衡數據冗余、一致性、查詢速度。