最全的Oracle-SQL筆記(8)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.