標籤:account oracle 使用者名稱 管理員 資料庫
1.8、資料庫設計範式
資料庫設計範式實際上非常的重要,但是從實際的開發來看,如果真的全部按照範式去做,則這個程式沒法寫,包括查詢語句也會變得複雜。
在Oracle中的scott使用者的全部表,實際上就已經很好的體現了一張設計思路,僱員-部門的關係。
1) 第一範式
例如,現在假設有如下的資料庫建立指令碼
create table person(
pid number(4) primary key not null,
name varchar2(50),
info varchar(200)
);
插入以下測試資料
insert into person(pid,name,info) values(1111,‘張三‘,‘1983年11月23日出生,現在的住址是:北京市西城區。。。。。‘);
實際上對於人員來看,由以下幾部分組成:
|-生日:1983年1月23日
|-省市:北京
|-地區:西城區
|-詳細的資訊:。。。。。
每個欄位不可再分,所以,以上的資料庫建立指令碼修改如下:
create table person(
pid number(4) primary key not null,
name varchar2(50),
birthday date,
area varchar2(200),
subarea varchar2(200),
address varchar2(200)
);
這種設計看上去每個欄位是不可再分的,但是我們應該會注意到,在一些網站的註冊中,會要求使用者分別輸入“姓”和“名”,所以,可將上面的設計修改如下:
create table person(
pid number(4) primary key not null,
姓 varchar2(50),
名 varchar2(50),
birthday date,
area varchar2(200),
subarea varchar2(200),
address varchar2(200)
);
所以,在設計表欄位的時候,最好保證每個欄位均不能再分。
2) 第二範式
第一範式的要求非常簡單,保證每個欄位有意義。但是如果所有的操作都使用第一範式,那麼會存在問題:
現在建立一張學生選課表:學號、姓名、年齡、課程名稱、成績、學分
create table selectcourse(
stuno varchar2(50),
stuname varchar2(50),
stuage number,
cname varchar2(50),
grade number,
credit number
);
以上的指令碼符合第一範式的要求,但是如果按照第一範式設計的話,會存在問題:
insert into selectcourse values(‘s001‘,‘張三‘,21,‘JAVA‘,89,0.3);
insert into selectcourse values(‘s001‘,‘李四‘,20,‘JAVA‘,78,0.3);
insert into selectcourse values(‘s001‘,‘王五‘,23,‘JAVA‘,80,0.3);
insert into selectcourse values(‘s001‘,趙六‘,22,‘JAVA‘,90,0.3);
從以上的資料庫指令碼上可以發現,所有的課程資訊冗餘了,而且還存在以下問題:
|-如果一門課程沒有一個學生選擇,則此而成就從學校徹底消失了
|-課程中本身也應該包含一個課程的編號,但是如果按照以上的設計,則課程編號肯定重複
|-如果要更改課程資訊,則要更改許多條記錄
我們使用第二範式修改資料庫指令碼:
|-學生是一個實體--學生表
create table student(
stuno varchar2(50) primary key not null,
stuname varchar2(50),
stuage number
);
|-課程也應該是一個實體--課程表
create table course(
cid number(5) primary key not null,
cname varchar2(50),
credit number
);
|-學生選課資訊也是一個實體--學生選課表
create table selectcourse(
stuno varchar2(50),
cid number(5),
grade number,
加入外部索引鍵關聯,因為學生沒了,成績就沒了,因為課程沒了,成績就沒了
);
以上設計解決了以下問題:
|-學生不選課的時候,課程資訊不會消失
|-更新課程的時候直接更新課程表即可
|-所有的關聯關係在關係表中體現。
3) 第三範式
在實際開發中,第三範式的使用是最多的。
例如,現在要求設計一張學生表,包含學號、姓名、年齡、所在院校、學院地址、學院電話,此時肯定不能使用第一範式,但是現在如果使用的是第二範式呢?
create table student(
stuno varchar2(50) primary key not null,
stuname varchar2(50),
stuage number
);
create table collage(
cid number(4) primary key not null,
cname varchar2(50) not not null,
caddress varchar2(200) not nul,
ctel varchar2(200) not null
);
create table studentcollage(
stuno varchar2(50),
cid number(4),
設定主-外鍵關係
);
按照上面的設計,一個學生可以同時在多個學院同時上課,多個學院會同時有同一個學生,此時,最好的做法是:一個學院包含多個學生,一個學生屬於一個學院,實際上,此設計就完全類似於部門和僱員表的設計結構。
create table collage(
cid number(4) primary key not null,
cname varchar2(50) not not null,
caddress varchar2(200) not nul,
ctel varchar2(200) not null
);
create table student(
stuno varchar2(50) primary key not null,
stuname varchar2(50),
stuage number,
cid number(4),
建立主-外鍵關係
);
該設計是一個很明確的一對多的關係設計。
資料庫的唯一原則:
|-資料庫表的關聯查詢越少越好,SQL語句的複雜度越低越好。
1.9、資料庫設計工具
在實際中資料庫也有自己的設計工具,比較常用的就是Sybase的PowerDesigner開發工具,此工具可以方便的做各種設計,啟動之後,可以使用此工具,進行資料庫的建模設計。
啟動PowerDesigner後,選擇建立,Physical Data Model,選擇Oracle資料庫
下面使用PowerDesigner工具將Oracle中的dept和emp表進行還原
建立表--在工具中進行主-外鍵的操作--得到關係之後,就可以通過Powerdesigner工具進行資料庫指令碼的建立了。
1.10、資料庫設計分析
1) 要求
設計要求,要求設計一個網上購物程式(使用Powerdesigner建立模型並編寫測試資料),有以下的需求
|-管理員可以再後台添加商品,每個商品屬於一個商品組
|-可以對管理員進行分組,對每一組進行分別授權,即一個Administrator 群組可以有多個管理員,一個Administrator 群組有多個許可權,一個管理員可以再多個組
|-使用者可以自己購買商品,購買商品時要在訂單表中添加資訊,一個使用者可以同時購買多個商品,使用者可以選擇自己所在的地區進行商品的派送
|-使用者可以根據自己的購買積分,對商品進行折扣
2) 實現
根據第一個要求,一個商品屬於一個商品組,則此時應該建立一個“一對多”的關係
根據第二個要求,可以對管理員進行分組,需要管理員表、Administrator 群組表、許可權表、管理員-Administrator 群組表、Administrator 群組-許可權表
管理員和商品表也要存在關係
需要一個使用者表,與其產生關係的有地區表、子地區表、訂單表、訂單詳情表、積分表
正常情況下,一份訂單肯定會按照以上的格式顯示,那麼請問,這樣一來要查詢多少張表?
|-使用者表(使用者姓名、使用者電話、使用者地址)
|-地區表-子地區表(使用者地區)
|-訂單表、訂單詳情表(商品總價、訂單日期、郵遞區號)
本查詢需要同時查詢6張表。本程式中的所有代碼都是按照標準範式完成的,所以此時出現了以上的問題。
在開發中減少多表查詢的方法可以通過冗餘資料完成。</pre>
<p> </p>
<pre name="code" >Oracle 筆記
1
本文出自 “江湖笑笑生” 部落格,請務必保留此出處http://hashlinux.blog.51cto.com/9647696/1792707
最全的Oracle-SQL筆記(8)