ER 和 數據庫關系模式


http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/

我們眼下所接觸的數據庫基本上是關系數據庫,關系數據庫中的關系模式是型,而關系是值。關系模式是對關系的描寫敘述。

什么是關系?關系實質上是一張二維表,當中每一行是一個元組,每一列是一個屬性,每一個元組是該關系涉及到屬性集合笛卡爾積的一個元素。(笛卡爾積是這種一個集合。集合中的元素是有序對,若A=0,1B=ab}則:A*B={<0,a><0,b>,<1,a>,<1,b>},關系是元組的集合,所以關系模式要描寫敘述元組的集合,當中包含那些屬性,屬性來自域,屬性與域之間的映射關系。

關系模式能夠用五元組形式表示:RUDDomF),當中R:表示關系名,U:表示屬性集合,Dom,表示屬性域(來自那個域),F:表示函數依賴。

可是普通情況下,我們通常把關系模式表示為:RU)或者RAB)(當中AB代表U中的屬性)

 

那么E-R圖轉化成關系模式的步驟。

前提:是已經把需求中的實體,以及實體中聯系確定。

第一:把每一個實體都轉化成關系模式RAB)形式。(AB代表屬性)

第二:實體中的屬性即關系模式中的屬性要求是滿足第一范式(原子性,不可再分)

第三:也是最重要的步驟,實體之間聯系的轉換。

       實體之間的聯系分為:11nm三種形式。

    11:1之間的轉換。

          將兩個實體轉化成關系模式之后,然后把隨意實體的主鍵和聯系的屬性放到還有一個實體的關系模式中。如圖:

E-R圖轉換成關系模式 - 煥月 - 梁煥月的博客 拼搏騰飛

    

 結果例如以下:

   R1教師編號、姓名、性別)

   R2班級號、專業號、學院號、教師編號、任職日期)

   或者:

   R1教師編號、姓名、性別、班級號、任職日期)

   R2班級號 專業號、學院號)

  21n的轉換。

      將兩個實體各自轉化成關系模式后,然后,把聯系數量為1的實體的主鍵和聯系的屬性放到聯系數量為n的實體關系模式中。

       比方:學生和宿舍之間的關系。

    

E-R圖轉換成關系模式 - 煥月 - 梁煥月的博客 拼搏騰飛

 

        轉換之后的結果例如以下:

        R1學號、姓名、性別、宿舍號

        R2宿舍號、床位數)

 3nn的轉換。

         將兩個實體各自轉換成關系模式后,然后,把兩個實體中的主鍵和聯系的屬性放到還有一個關系模式中.(注意多生成一個關系模式)

       

E-R圖轉換成關系模式 - 煥月 - 梁煥月的博客 拼搏騰飛

   

轉換后的結果例如以下:

 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表中作為外鍵,該表稱為從表。

image(圖1  “一對一”,兩實體都為強制存在)

圖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所看到的)。

image(圖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值。

image(圖3  “一對一”,兩實體都為可選存在)

圖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。

image(圖4  “一對多”,兩實體都為強制存在)

圖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. “一對多”,一實體可選存在,還有一實體強制存在

image(圖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值無關。

image(圖6  “多對多”,兩實體都為可選存在)

圖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. “一對一”,兩實體都為可選存在

image(圖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. “一對多”,“一”端為強制存在,“多”端為可選存在

image(圖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. “多對多”,兩端都為可選存在

image(圖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. “一對一對一”三元關系

image(圖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. “一對一對多”三元關系

image(圖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. “一對多對多”三元關系

image(圖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. “多對多對多”三元關系

image(圖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
);



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM