http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/
我們眼下所接觸的數據庫基本上是關系數據庫,關系數據庫中的關系模式是型,而關系是值。關系模式是對關系的描寫敘述。
什么是關系?關系實質上是一張二維表,當中每一行是一個元組,每一列是一個屬性,每一個元組是該關系涉及到屬性集合笛卡爾積的一個元素。(笛卡爾積是這種一個集合。集合中的元素是有序對,若A={0,1}B={a,b}則:A*B={<0,a>,<0,b>,<1,a>,<1,b>}),關系是元組的集合,所以關系模式要描寫敘述元組的集合,當中包含那些屬性,屬性來自域,屬性與域之間的映射關系。
關系模式能夠用五元組形式表示:R(U,D,Dom,F),當中R:表示關系名,U:表示屬性集合,Dom,表示屬性域(來自那個域),F:表示函數依賴。
可是普通情況下,我們通常把關系模式表示為:R(U)或者R(A,B)(當中A、B代表U中的屬性)
那么E-R圖轉化成關系模式的步驟。
前提:是已經把需求中的實體,以及實體中聯系確定。
第一:把每一個實體都轉化成關系模式R(A、B)形式。(A、B代表屬性)
第二:實體中的屬性即關系模式中的屬性要求是滿足第一范式(原子性,不可再分)
第三:也是最重要的步驟,實體之間聯系的轉換。
實體之間的聯系分為:1:1 ,1:n,m:n 三種形式。
(1)1:1之間的轉換。
將兩個實體轉化成關系模式之后,然后把隨意實體的主鍵和聯系的屬性放到還有一個實體的關系模式中。如圖:
結果例如以下:
R1(教師編號、姓名、性別)
R2(班級號、專業號、學院號、教師編號、任職日期)
或者:
R1(教師編號、姓名、性別、班級號、任職日期)
R2(班級號、 專業號、學院號)
(2)1:n的轉換。
將兩個實體各自轉化成關系模式后,然后,把聯系數量為1的實體的主鍵和聯系的屬性放到聯系數量為n的實體關系模式中。
比方:學生和宿舍之間的關系。
轉換之后的結果例如以下:
R1(學號、姓名、性別、宿舍號)
R2(宿舍號、床位數)
(3)n:n的轉換。
將兩個實體各自轉換成關系模式后,然后,把兩個實體中的主鍵和聯系的屬性放到還有一個關系模式中.(注意多生成一個關系模式)
轉換后的結果例如以下:
R1(學號、姓名、性別)
R2(獎勵編號、獎勵名稱、獎勵金額)
R3(學號、獎勵編號、獎勵日期)
注:E-R圖中聯系沒有聯系屬性,EE-R圖中含有聯系屬性。
含有下划線的屬性代表是主屬性,在表中當做主鍵。紅字體代表的外鍵。
以上的比較簡單
http://www.cnblogs.com/DBFocus/archive/2011/07/25/2116609.html
這個非常專業
轉化過程中對於NULL值的處理規則
1. 當實體之間的關系是可選的,SQL表中的外鍵列同意為NULL。
2. 當實體之間的關系是強制的,SQL表中的外鍵列不同意為NULL。
3. 由“多對多”關系轉化得到的SQL表,當中的隨意外鍵列都不同意為NULL。
一般二元關系的轉化
1. “一對一”,兩實體都為強制存在
當兩個實體都是強制存在的(如圖1所看到的),每個實體都相應轉化為一張SQL表,並選擇兩個實體中隨意一個作為主表,把它的主鍵放入還有一個實體相應的SQL表中作為外鍵,該表稱為從表。
圖1表示的語義為:每一張報表都有一個縮寫,每一縮寫僅僅代表一張報表。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
create
table
report
(
report_no
integer
,
report_name
varchar
(256),
primary
key
(report_no)
);
create
table
abbreviation
(
abbr_no
char
(6),
report_no
integer
not
null
unique
,
primary
key
(abbr_no),
foreign
key
(report_no)
references
report
on
delete
cascade
on
update
cascade
);
|
注:本節中全部SQL代碼在SQL Server 2008環境中測試通過。
2. “一對一”,一實體可選存在,還有一實體強制存在
當兩個實體中有一個為“可選的”,則“可選的”實體相應的SQL表一般作為從表,包括指向還有一實體的外鍵(如圖2所看到的)。
圖2表示的語義為:每個部門必須有一位經理,大部分員工不是經理,一名員工最多僅僅能是一個部門的經理。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
create
table
employee
(
emp_id
char
(10),
emp_name
char
(20),
primary
key
(emp_id)
);
create
table
department
(
dept_no
integer
,
dept_name
char
(20),
mgr_id
char
(10)
not
null
unique
,
primary
key
(dept_no),
foreign
key
(mgr_id)
references
employee
on
update
cascade
);
|
還有一種轉化方式是把“可選的”實體作為主表,讓“強制存在的”實體作為從表,包括外鍵指向“可選的”實體,這樣的方式外鍵列同意為NULL。以圖2為例,可把實體Employee轉化為從表,包括外鍵列dept_no指向實體Department,該外鍵列將同意為NULL。由於Employee的數量遠大於Department的數量,故會占用很多其它的存儲空間。
3. “一對一”,兩實體都為可選存在
當兩個實體都是可選的(如圖3所看到的),可選隨意一個實體包括外鍵指向還有一實體,外鍵列同意為NULL值。
圖3表示的語義為:部分台式電腦被分配給部分project師,一台電腦僅僅能分配給一名project師,一名project師最多僅僅能分配到一台電腦。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
create
table
engineer
(
emp_id
char
(10),
emp_name
char
(20),
primary
key
(emp_id)
);
create
table
desktop
(
desktop_no
integer
,
emp_id
char
(10),
primary
key
(desktop_no),
foreign
key
(emp_id)
references
engineer
on
delete
set
null
on
update
cascade
);
|
4. “一對多”,兩實體都為強制存在
在“一對多”關系中,不管“多”端是強制存在的還是可選存在的都不會影響其轉化形式,外鍵必須出如今“多”端,即“多”端轉化為從表。當“一”端實體是可選存在時,“多”端實體表中的外鍵列同意為NULL。
圖4表示的語義為:每名員工都屬於一個部門,每一個部門至少有一名員工。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
create
table
department
(
dept_no
integer
,
dept_name
char
(20),
primary
key
(dept_no)
);
create
table
employee
(
emp_id
char
(10),
emp_name
char
(20),
dept_no
integer
not
null
,
primary
key
(emp_id),
foreign
key
(dept_no)
references
department
on
update
cascade
);
|
5. “一對多”,一實體可選存在,還有一實體強制存在
圖5表示的語義為:每一個部門至少公布一張報表,一張報表不一定由某個部門來公布。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
create
table
department
(
dept_no
integer
,
dept_name
char
(20),
primary
key
(dept_no)
);
create
table
report
(
report_no
integer
,
dept_no
integer
,
primary
key
(report_no),
foreign
key
(dept_no)
references
department
on
delete
set
null
on
update
cascade
);
|
注:解釋一下report表創建腳本的最后一行“on delete set null on update cascade”的用處。當沒有這一行時,更新department表中dept_no字段會失敗,刪除department中記錄也會失敗,報出與外鍵約束沖突的提示。假設有了最后一行,更新department表中dept_no字段,report表中相應記錄的dept_no也會同步更改,刪除department中記錄,會使report表中相應記錄的dept_no值變為NULL。
6. “多對多”,兩實體都為可選存在
在“多對多”關系中,須要一張新關系表包括兩個實體的主鍵。不管兩邊實體是否為可選存在的,其轉化形式一致,關系表中的外鍵列不能為NULL。實體可選存在,在關系表中表現為是否存在相應記錄,而與外鍵是否同意NULL值無關。
圖6表示的語義為:一名project師可能是專業協會的會員且可參加多個專業協會。每個專業協會可能有多位project師參加。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
create
table
engineer
(
emp_id
char
(10),
primary
key
(emp_id)
);
create
table
prof_assoc
(
assoc_name
varchar
(256),
primary
key
(assoc_name)
);
create
table
belongs_to
(
emp_id
char
(10),
assoc_name
varchar
(256),
primary
key
(emp_id, assoc_name),
foreign
key
(emp_id)
references
engineer
on
delete
cascade
on
update
cascade
,
foreign
key
(assoc_name)
references
prof_assoc
on
delete
cascade
on
update
cascade
);
|
二元回歸關系的轉化
對於“一對一”或“一對多”回歸關系的轉化都是在SQL表中添加一列與主鍵列類型、長度同樣的外鍵列指向實體本身。外鍵列的命名需與主鍵列不同,表明其用意。外鍵列的約束依據語義進行確定。
7. “一對一”,兩實體都為可選存在
圖7表示的語義為:公司員工之間可能存在夫妻關系。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
|
create
table
employee
(
emp_id
char
(10),
emp_name
char
(20),
spouse_id
char
(10),
primary
key
(emp_id),
foreign
key
(spouse_id)
references
employee
);
|
8. “一對多”,“一”端為強制存在,“多”端為可選存在
(圖8 “一對多”,“一”端為強制存在,“多”端為可選存在)
圖8表示的語義為:project師被分為多個組,每一個組有一名組長。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
|
create
table
engineer
(
emp_id
char
(10),
leader_id
char
(10)
not
null
,
primary
key
(emp_id),
foreign
key
(leader_id)
references
engineer
);
|
“多對多”回歸關系不管是可選存在的還是強制存在的都需新增一張關系表,表中的外鍵列須為NOT NULL。
9. “多對多”,兩端都為可選存在
圖9表示的語義為:社交站點中人之間的朋友關系,每一個人都可能有非常多朋友。轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
create
table
person
(
person_id
char
(10),
person_name
char
(20),
primary
key
(person_id)
);
create
table
friend
(
person_id
char
(10),
friend_id
char
(10),
primary
key
(person_id, friend_id),
foreign
key
(person_id)
references
person,
foreign
key
(friend_id)
references
person,
check
(person_id < friend_id)
);
|
三元和n元關系的轉化
不管哪種形式的三元關系在轉化時都會創建一張關系表包括全部實體的主鍵。三元關系中,“一”端實體的個數決定了函數依賴的數量。因此,“一對一對一”關系有三個函數依賴式,“一對一對多”關系有兩個函數依賴式,“一對多對多”關系有一個函數依賴式。“多對多對多”關系的主鍵為全部外鍵的聯合。
10. “一對一對一”三元關系
圖10表示的語義為:
1名技術員在1個項目中使用特定的1本記事簿
1本記事簿在1個項目中僅僅屬於1名技術員
1名技術員的1本記事簿僅僅用於記錄1個項目
注:1名技術員仍能夠做多個項目,對於不同的項目維護不同的記事簿。
轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
create
table
technician
(
emp_id
char
(10),
primary
key
(emp_id)
);
create
table
project
(
project_name
char
(20),
primary
key
(project_name)
);
create
table
notebook
(
notebook_no
integer
,
primary
key
(notebook_no)
);
create
table
uses_notebook
(
emp_id
char
(10),
project_name
char
(20),
notebook_no
integer
not
null
,
primary
key
(emp_id, project_name),
foreign
key
(emp_id)
references
technician
on
delete
cascade
on
update
cascade
,
foreign
key
(project_name)
references
project
on
delete
cascade
on
update
cascade
,
foreign
key
(notebook_no)
references
notebook
on
delete
cascade
on
update
cascade
,
unique
(emp_id, notebook_no),
unique
(project_name, notebook_no)
);
|
函數依賴
emp_id, project_name -> notebook_no
emp_id, notebook_no -> project_name
project_name, notebook_no -> emp_id
11. “一對一對多”三元關系
圖11表示的語義為:
參與1個項目的1名員工僅僅會在1個地點做該項目
1名員工在1個地點僅僅能做1個項目
1個地點的1個項目可能有多名員工參與
注:1名員工能夠在不同的地點做不同的項目
轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
create
table
employee
(
emp_id
char
(10),
emp_name
char
(20),
primary
key
(emp_id)
);
create
table
project
(
project_name
char
(20),
primary
key
(project_name)
);
create
table
location
(
loc_name
char
(15),
primary
key
(loc_name)
);
create
table
assigned_to
(
emp_id
char
(10),
project_name
char
(20),
loc_name
char
(15)
not
null
,
primary
key
(emp_id, project_name),
foreign
key
(emp_id)
references
employee
on
delete
cascade
on
update
cascade
,
foreign
key
(project_name)
references
project
on
delete
cascade
on
update
cascade
,
foreign
key
(loc_name)
references
location
on
delete
cascade
on
update
cascade
,
unique
(emp_id, loc_name)
);
|
函數依賴:
emp_id, loc_name -> project_name
emp_id, project_name -> loc_name
12. “一對多對多”三元關系
圖12表示的語義為:
1個項目中的1名project師僅僅會有1名經理
1個項目中的1名經理會帶領多名project師做該項目
1名經理和他手下的1名project師可能參與多個項目
轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
create
table
project
(
project_name
char
(20),
primary
key
(project_name)
);
create
table
manager
(
mgr_id
char
(10),
primary
key
(mgr_id)
);
create
table
engineer
(
emp_id
char
(10),
primary
key
(emp_id)
);
create
table
manages
(
project_name
char
(20),
mgr_id
char
(10)
not
null
,
emp_id
char
(10),
primary
key
(project_name, emp_id),
foreign
key
(project_name)
references
project
on
delete
cascade
on
update
cascade
,
foreign
key
(mgr_id)
references
manager
on
delete
cascade
on
update
cascade
,
foreign
key
(emp_id)
references
engineer
on
delete
cascade
on
update
cascade
);
|
函數依賴:
project_name, emp_id -> mgr_id
13. “多對多對多”三元關系
圖13表示的語義為:
1名員工在1個項目中能夠運用多種技能
1名員工的1項技能能夠在多個項目中運用
1個項目中的1項技能能夠被參與該項目的多名員工運用
轉化得到的SQL表定義例如以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
create
table
employee
(
emp_id
char
(10),
emp_name
char
(20),
primary
key
(emp_id)
);
create
table
skill
(
skill_type
char
(15),
primary
key
(skill_type)
);
create
table
project
(
project_name
char
(20),
primary
key
(project_name)
);
create
table
sill_used
(
emp_id
char
(10),
skill_type
char
(15),
project_name
char
(20),
primary
key
(emp_id, skill_type, project_name),
foreign
key
(emp_id)
references
employee
on
delete
cascade
on
update
cascade
,
foreign
key
(skill_type)
references
skill
on
delete
cascade
on
update
cascade
,
foreign
key
(project_name)
references
project
on
delete
cascade
on
update
cascade
);
|