資料庫設計範式是一個很重要的概念,但是這個重要程度只是適合於參考。使用資料庫設計範式,可以讓數據表更好的進行數據的保存,因為在合理的設計,如果數據量一大也肯定會存在性能上的問題,所以在開發中,唯一可以稱為設計的寶典——設計的時候儘量避免日後的程式出現多表關聯查詢。 第一範式 所謂的第一範式指的是數據... ...
資料庫設計範式是一個很重要的概念,但是這個重要程度只是適合於參考。使用資料庫設計範式,可以讓數據表更好的進行數據的保存,因為在合理的設計,如果數據量一大也肯定會存在性能上的問題,所以在開發中,唯一可以稱為設計的寶典——設計的時候儘量避免日後的程式出現多表關聯查詢。
第一範式
所謂的第一範式指的是數據表中的數據列不可再分。例如,現有如下一張表:
- CREATE TABLE member(
- mid NUMBER PRIMARY KEY,
- name VARCHAR2(200) NOT NULL,
- contact VARCHAR2(200)
- )
這個時候設計的就不合理,因為聯繫方式由多種數據所組成(電話、地址、email、手機、郵政編碼等),所以這種設計是不符合第一範式的,現在可以修改設計如下:
- CREATE TABLE member(
- mid NUMBER PRIMARY KEY,
- name VARCHAR2(200) NOT NULL,
- address VARCHAR2(200),
- zipcode VARCHAR2(6),
- mobile VARCHAR2(20),
- tel VARCHAR2(20)
- )
但是在這裡有兩點需要說明。
1、關於姓名,在國外的表設計姓名也分為姓和名兩類,但是在中國就是姓名保存。
2、關於生日,生日有專門的數據類型(DATE),所以不能將其設置為生日年、生日月、生日日;
所謂的不可分割指的是所有的數據類型都是使用資料庫提供好的各個數據類型。
第二範式(多對多)
第二範式定義數據表中的非關鍵欄位不存在對任意候選關鍵欄位的部分函數依賴。
第二範式分為兩種理解:
1、列之間不應該存在函數關係,現有如下一張表:
- CREATE TABLE orders(
- oid NUMBER PRIMARY KEY,
- amount NUMBER,
- price NUMBER,
- allprice NUMBER
- )
現在的商品總價(allprice)=商品單價(price)*商品數量(amount),所以存在了函數的依賴關係。
2、通過一個數據表的設計完成一個學生選課系統,如果說現在按照第一範式,則如下設計:
- CREATE TABLE studentcourse(
- stuid NUMBER PRIMARY KEY,
- stuname VARCHAR2(20) NOT NULL,
- cname VARCHAR2(50) NOT NULL,
- credit NUMBER NOT NULL,
- score NUMBER
- )
- INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
- VALUES (1,'張三','java',3,99);
- INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
- VALUES (2,'李四','java',3,89);
- INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
- VALUES (3,'王五','java',3,67);
- INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
- VALUES (1,'張三','C',1,79);
- INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
- VALUES (2,'李四','C',1,69);
這種設計符合第一範式,但是不符合第二範式,因為程式會存在如下的錯誤:
(1)數據重覆,學生和課程的數據都處於重覆的狀態,而且最為嚴重的是主鍵的設置問題。
(2)數據更新過多,如果現在一門課程已經有1000人參見的話,則更改一門課程學分的時候,需要修改1000條記錄,肯定性能上會有影響。
(3)如果一門課程沒有一個學生參加,這門課程就從學校徹底消失了。
如果想要解決此問題,則可以將數據表的設計修改如下:
- CREATE TABLE student(
- stuid NUMBER PRIMARY KEY,
- stname VARCHAR2(20) NOT NULL
- )
- CREATE TABLE course(
- cid NUMBER PRIMARY KEY,
- cname VARCHAR2(50) NOT NULL,
- credit NUMBER NOT NULL
- )
- CREATE TABLE studentcourse(
- stuid NUMBER REFERENCES student(stuid),
- cid NUMBER REFERENCES course(cid),
- score NUMBER
- )
- INSERT INTO student (stuid,stname)
- VALUES (1,'張三');
- INSERT INTO student (stuid,stname)
- VALUES (2,'李四');
- INSERT INTO student (stuid,stname)
- VALUES (3,'王五');
- INSERT INTO course (cid,cname,credit)
- VALUES (10,'java',3);
- INSERT INTO course (cid,cname,credit)
- VALUES (11,'c',1);
- INSERT INTO course (cid,cname,credit)
- VALUES (12,'oracle',2);
- INSERT INTO (stuid,cid,score) VALUES (1,10,99);
- INSERT INTO (stuid,cid,score) VALUES (2,10,89);
- INSERT INTO (stuid,cid,score) VALUES (3,10,67);
- INSERT INTO (stuid,cid,score) VALUES (1,11,79);
- INSERT INTO (stuid,cid,score) VALUES (1,11,69);
第三範式(一對多)
例如,一個學校有多個學生,如果用第一範式無法實現,而如果用第二範式則表示多對多的關係,即,一個學校有多個學生,一個學生在多個學校,不符合實際情況。所以此時可以使用第三範式,設計編寫如下:
- CREATE TABLE school(
- sid NUMBER PRIMARY KEY,
- sname VARCHAR2(20) NOT NULL
- );
- CREATE TABLE student(
- stuid NUMBER PRIMARY KEY,
- stuname VARCHAR2(20) NOT NULL,
- sid NUMBER REFERENCES school(sid)
- );
而在實際的項目之中,第三範式的使用是最多的。
以上三個範式只是作為參考使用,實際項目中需要具體問題具體分析。
資料庫的設計工具PowerDesigner
對於資料庫設計工具有很多,但是其中最著名的,或者說使用最廣泛的就是Sybase PowerDesigner設計工具。