日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ER TO SQL语句

發(fā)布時間:2023/11/30 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ER TO SQL语句 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

ER TO SQL語句的轉(zhuǎn)換,在數(shù)據(jù)庫設(shè)計生命周期的位置如下所示。

?

一、轉(zhuǎn)換的類別

從ER圖轉(zhuǎn)化得到關(guān)系數(shù)據(jù)庫中的SQL表,一般可分為3類:

1)轉(zhuǎn)化得到的SQL表與原始實體包含相同信息內(nèi)容。該類轉(zhuǎn)化一般適用于:

二元“多對多”關(guān)系中,任何一端的實體

二元“一對多”關(guān)系中,“一”一端的實體

二元“一對一”關(guān)系中,某一端的實體

二元“多對多”回歸關(guān)系中,任何一端的實體(注:關(guān)系兩端都指向同一個實體)

三元或n元關(guān)系中,任何一端的實體

層次泛化關(guān)系中,超類實體

2) 轉(zhuǎn)化得到的SQL表除了包含原始實體的信息內(nèi)容之外,還包含原始實體父實體的外鍵。該類轉(zhuǎn)化一般適用于:

二元“一對多”關(guān)系中,“多”一端的實體

二元“一對一”關(guān)系中,某一端的實體

二元“一對一”或“一對多”回歸關(guān)系中,任何一端的實體

該轉(zhuǎn)化是處理關(guān)系的常用方法之一,即在子表中增加指向父表中主鍵的外鍵信息。

3)由“關(guān)系”轉(zhuǎn)化得到的SQL表,該表包含“關(guān)系”所涉及的所有實體的外鍵,以及該“關(guān)系”自身的屬性信息。該類轉(zhuǎn)化一般適用于:

二元“多對多”關(guān)系

二元“多對多”回歸關(guān)系

三元或n元關(guān)系

該轉(zhuǎn)化是另一種常用的關(guān)系處理方法。對于“多對多”關(guān)系需要定義為一張包含兩個相關(guān)實體主鍵的獨(dú)立表,該表還能包含關(guān)系的屬性信息。

?

轉(zhuǎn)化過程中對于外鍵NULL值的處理

1. 當(dāng)實體之間的關(guān)系是可選的,SQL表中的外鍵列允許為NULL。

2. 當(dāng)實體之間的關(guān)系是強(qiáng)制的,SQL表中的外鍵列不允許為NULL。

3. 由“多對多”關(guān)系轉(zhuǎn)化得到的SQL表,其中的任意外鍵列都不允許為NULL。

?

?

二、普通二元關(guān)系的轉(zhuǎn)化

1. “一對一”,兩實體都為強(qiáng)制存在

當(dāng)兩個實體都是強(qiáng)制存在的(如圖1所示),每一個實體都對應(yīng)轉(zhuǎn)化為一張SQL表,并選擇兩個實體中任意一個作為主表,把它的主鍵放入另一個實體對應(yīng)的SQL表中作為外鍵,該表稱為從表。

圖1? “一對一”,兩實體都為強(qiáng)制存在

圖1表示的語義為:每一張報表都有一個縮寫,每一縮寫只代表一張報表。轉(zhuǎn)化得到的SQL表定義如下:

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 );

?2. “一對一”,一實體可選存在,另一實體強(qiáng)制存在

當(dāng)兩個實體中有一個為“可選的”,則“可選的”實體對應(yīng)的SQL表一般作為從表,包含指向另一實體的外鍵(如圖2所示)。

圖2? “一對一”,一實體可選存在,另一實體強(qiáng)制存在

圖2表示的語義為:每一個部門必須有一位經(jīng)理,大部分員工不是經(jīng)理,一名員工最多只能是一個部門的經(jīng)理。轉(zhuǎn)化得到的SQL表定義如下:

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 );

?

另一種轉(zhuǎn)化方式是把“可選的”實體作為主表,讓“強(qiáng)制存在的”實體作為從表,包含外鍵指向“可選的”實體,這種方式外鍵列允許為NULL。以圖2為例,可把實體Employee轉(zhuǎn)化為從表,包含外鍵列dept_no指向?qū)嶓wDepartment,該外鍵列將允許為NULL。因為Employee的數(shù)量遠(yuǎn)大于Department的數(shù)量,故會占用更多的存儲空間。

?

3. “一對一”,兩實體都為可選存在

當(dāng)兩個實體都是可選的(如圖3所示),可選任意一個實體包含外鍵指向另一實體,外鍵列允許為NULL值。

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

圖3表示的語義為:部分臺式電腦被分配給部分工程師,一臺電腦只能分配給一名工程師,一名工程師最多只能分配到一臺電腦。轉(zhuǎn)化得到的SQL表定義如下:

?

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 engineeron delete set null on update cascade );

4. “一對多”,兩實體都為強(qiáng)制存在

在“一對多”關(guān)系中,無論“多”端是強(qiáng)制存在的還是可選存在的都不會影響其轉(zhuǎn)化形式,外鍵必須出現(xiàn)在“多”端,即“多”端轉(zhuǎn)化為從表。當(dāng)“一”端實體是可選存在時,“多”端實體表中的外鍵列允許為NULL。

圖4? “一對多”,兩實體都為強(qiáng)制存在

圖4表示的語義為:每名員工都屬于一個部門,每個部門至少有一名員工。轉(zhuǎn)化得到的SQL表定義如下:

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 departmenton update cascade );

5. “一對多”,一實體可選存在,另一實體強(qiáng)制存在

圖5? “一對多”,一實體可選存在,另一實體強(qiáng)制存在

圖5表示的語義為:每個部門至少發(fā)布一張報表,一張報表不一定由某個部門來發(fā)布。轉(zhuǎn)化得到的SQL表定義如下:

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 departmenton delete set null on update cascade );

?

注:解釋一下report表創(chuàng)建腳本的最后一行“on delete set null on update cascade”的用處。當(dāng)沒有這一行時,更新department表中dept_no字段會失敗,刪除department中記錄也會失敗,報出與外鍵約束沖突的提示。如果有了最后一行,更新department表中dept_no字段,report表中對應(yīng)記錄的dept_no也會同步更改,刪除department中記錄,會使report表中對應(yīng)記錄的dept_no值變?yōu)镹ULL。

?

6. “多對多”,兩實體都為可選存在

在“多對多”關(guān)系中,需要一張新關(guān)系表包含兩個實體的主鍵。無論兩邊實體是否為可選存在的,其轉(zhuǎn)化形式一致,關(guān)系表中的外鍵列不能為NULL。實體可選存在,在關(guān)系表中表現(xiàn)為是否存在對應(yīng)記錄,而與外鍵是否允許NULL值無關(guān)。

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

圖6表示的語義為:一名工程師可能是專業(yè)協(xié)會的會員且可參加多個專業(yè)協(xié)會。每一個專業(yè)協(xié)會可能有多位工程師參加。轉(zhuǎn)化得到的SQL表定義如下:

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 engineeron delete cascade on update cascade,foreign key(assoc_name) references prof_assocon delete cascade on update cascade );

?

三、二元回歸關(guān)系的轉(zhuǎn)化

對于“一對一”或“一對多”回歸關(guān)系的轉(zhuǎn)化,都是在SQL表中增加一列與主鍵列類型、長度相同的外鍵列指向?qū)嶓w本身。外鍵列的命名需與主鍵列不同,表明其用意。外鍵列的約束根據(jù)語義進(jìn)行確定。

1.? “一對一”,兩實體都為可選存在

?

“一對一”,兩實體都為可選存在

圖7表示的語義為:公司員工之間可能存在夫妻關(guān)系。轉(zhuǎn)化得到的SQL表定義如下:

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 );

?

2. “一對多”,“一”端為強(qiáng)制存在,“多”端為可選存在

? “一對多”,“一”端為強(qiáng)制存在,“多”端為可選存在

圖8表示的語義為:工程師被分為多個組,每個組有一名組長。轉(zhuǎn)化得到的SQL表定義如下:

create table engineer (emp_id char(10),leader_id char(10) not null,primary key(emp_id),foreign key(leader_id) references engineer );

?

?

“多對多”回歸關(guān)系無論是可選存在的還是強(qiáng)制存在的都需新增一張關(guān)系表,表中的外鍵列須為NOT NULL。

3. “多對多”,兩端都為可選存在

“多對多”,兩端都為可選存在

圖9表示的語義為:社交網(wǎng)站中人之間的朋友關(guān)系,每個人都可能有很多朋友。轉(zhuǎn)化得到的SQL表定義如下:

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元關(guān)系的轉(zhuǎn)化

無論哪種形式的三元關(guān)系在轉(zhuǎn)化時都會創(chuàng)建一張關(guān)系表包含所有實體的主鍵。三元關(guān)系中,“一”端實體的個數(shù)決定了函數(shù)依賴的數(shù)量。因此,“一對一對一”關(guān)系有三個函數(shù)依賴式,“一對一對多”關(guān)系有兩個函數(shù)依賴式,“一對多對多”關(guān)系有一個函數(shù)依賴式。“多對多對多”關(guān)系的主鍵為所有外鍵的聯(lián)合。

1. “一對一對一”三元關(guān)系

“一對一對一”三元關(guān)系

以上表示的語義為:

1名技術(shù)員在1個項目中使用特定的1本記事簿

1本記事簿在1個項目中只屬于1名技術(shù)員

1名技術(shù)員的1本記事簿只用于記錄1個項目

注:1名技術(shù)員仍可以做多個項目,對于不同的項目維護(hù)不同的記事簿。

轉(zhuǎn)化得到的SQL表定義如下:

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 technicianon delete cascade on update cascade,foreign key(project_name) references projecton delete cascade on update cascade,foreign key(notebook_no) references notebookon delete cascade on update cascade,unique(emp_id, notebook_no),unique(project_name, notebook_no) );

?

函數(shù)依賴

emp_id, project_name -> notebook_no

emp_id, notebook_no -> project_name

project_name, notebook_no -> emp_id

?

2. “一對一對多”三元關(guān)系

“一對一對多”三元關(guān)系

表示的語義為:

參與1個項目的1名員工只會在1個地點(diǎn)做該項目

1名員工在1個地點(diǎn)只能做1個項目

1個地點(diǎn)的1個項目可能有多名員工參與

注:1名員工可以在不同的地點(diǎn)做不同的項目

轉(zhuǎn)化得到的SQL表定義如下:

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 employeeon delete cascade on update cascade,foreign key(project_name) references projecton delete cascade on update cascade,foreign key(loc_name) references locationon delete cascade on update cascade,unique(emp_id, loc_name) );

?

函數(shù)依賴:

emp_id, loc_name -> project_name

emp_id, project_name -> loc_name

?

3. “一對多對多”三元關(guān)系

“一對多對多”三元關(guān)系

表示的語義為:

1個項目中的1名工程師只會有1名經(jīng)理

1個項目中的1名經(jīng)理會帶領(lǐng)多名工程師做該項目

1名經(jīng)理和他手下的1名工程師可能參與多個項目

轉(zhuǎn)化得到的SQL表定義如下:

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 projecton delete cascade on update cascade,foreign key(mgr_id) references manageron delete cascade on update cascade,foreign key(emp_id) references engineeron delete cascade on update cascade );

?

函數(shù)依賴:

project_name, emp_id -> mgr_id

?

4. “多對多對多”三元關(guān)系

(圖13 “多對多對多”三元關(guān)系)

表示的語義為:

1名員工在1個項目中可以運(yùn)用多種技能

1名員工的1項技能可以在多個項目中運(yùn)用

1個項目中的1項技能可以被參與該項目的多名員工運(yùn)用

轉(zhuǎn)化得到的SQL表定義如下:

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 employeeon delete cascade on update cascade,foreign key(skill_type) references skillon delete cascade on update cascade,foreign key(project_name) references projecton delete cascade on update cascade );

?

?

五、泛化與聚合

泛化抽象結(jié)構(gòu)中的超類實體和各子類實體分別轉(zhuǎn)化為對應(yīng)的SQL表。超類實體轉(zhuǎn)化得到的表包含超類實體的鍵和所有公共屬性。子類實體轉(zhuǎn)化得到的表包含超類實體的鍵和子類實體特有的屬性。

要保證泛化層次中數(shù)據(jù)的完整性就必須保證某些操作在超類表和子類表的之間的同步。若超類表的主鍵需做更新,則子類表中對應(yīng)記錄的外鍵必須一起更新。若需刪除超類表中的記錄,子類表中對應(yīng)記錄也需一起刪除。我們可以在定義子類表時加入外鍵級聯(lián)約束。這一規(guī)則對于覆蓋與非覆蓋的子類泛化都適用。

14. 泛化層次關(guān)系

(圖14? 泛化層次關(guān)系)

圖14表示的語義為:

個人可能是一名員工,或是一位顧客,或同時是員工與顧客,或兩者都不是

轉(zhuǎn)化得到的SQL表定義如下:

create table individual (indiv_id char(10),indiv_name char(20),indiv_addr char(20),primary key(indiv_id) ); create table employee (emp_id char(10),job_title char(15),primary key(emp_id),foreign key(emp_id) references individualon delete cascade on update cascade ); create table customer (cust_no char(10),cust_credit char(12),primary key(cust_no),foreign key(cust_no) references individualon delete cascade on update cascade );

?

有些數(shù)據(jù)庫開發(fā)者還會在超類表中增加一個鑒別屬性。鑒別屬性對于每一種子類有不同的值,表示從哪一個子類中能獲得進(jìn)一步的信息。

聚合抽象的轉(zhuǎn)化方式也是為超類實體和每一個子類實體生成SQL表,但聚合中的超類與子類沒有公共屬性和完整性約束。聚合的主要功能是提供一種抽象來輔助視圖集成的過程。

?

?

?

六、總結(jié)

基本轉(zhuǎn)化步驟

以下總結(jié)了從ER圖到SQL表的基本轉(zhuǎn)化步驟

1. 把每一個實體轉(zhuǎn)化為一張表,其中包含鍵和非鍵屬性。

2. 把每一個“多對多”二元或二元回歸關(guān)系轉(zhuǎn)化為一張表,其中包含實體的鍵和關(guān)系的屬性。

3. 把三元及更高元(n元)關(guān)系轉(zhuǎn)化為一張表。

讓我們一一對這三個步驟進(jìn)行討論。

?

實體轉(zhuǎn)化

若兩個實體之間是“一對多”關(guān)系,把“一”端實體的主鍵加入到“多”端實體表中作為外鍵。若兩實體間是“一對一”關(guān)系,把某個“一”端實體的主鍵放入另一實體表中作為外鍵,加入外鍵的實體理論上可以任選,但一般會遵循如下原則:按照實體間最為自然的父子關(guān)系,把父實體的鍵放入子實體中;另一種策略是基于效率,把外鍵加入到具有較少行的表中。

把泛化層次中的每一個實體轉(zhuǎn)化為一張表。每張表都會包含超類實體的鍵。事實上子類實體的主鍵同時也是外鍵。超類表中還包含所有相關(guān)實體的公共非鍵屬性,其他表包含每一子類實體特有的非鍵屬性。

轉(zhuǎn)化得到的SQL表可能會包含not null, unique, foreign key等約束。每一張表必須有一個主鍵(primary key),主鍵隱含著not null和unique約束。

?

“多對多”二元關(guān)系轉(zhuǎn)化

每一個“多對多”二元關(guān)系能轉(zhuǎn)化為一張表,包含兩個實體的鍵和關(guān)系的屬性。

這一轉(zhuǎn)化得到的SQL表可能包含not null約束。在這里沒有使用unique約束的原因是關(guān)系表的主鍵是由各實體的外鍵復(fù)合組成的,unique約束已隱含。

?

三元關(guān)系轉(zhuǎn)化

每一個三元(或n元)關(guān)系轉(zhuǎn)化為一張表,包含相關(guān)實體的n個主鍵以及該關(guān)系的屬性。

這一轉(zhuǎn)化得到的表必須包含not null約束。關(guān)系表的主鍵由各實體的外鍵復(fù)合組成。n元關(guān)系表具有n個外鍵。除主鍵約束外,其他候選鍵(candidate key)也應(yīng)加上unique約束。

?

ER-to-SQL轉(zhuǎn)化步驟示例

把數(shù)據(jù)庫設(shè)計Step by Step (7)——概念數(shù)據(jù)建模中最后得到的公司人事和項目數(shù)據(jù)庫的全局ER圖(圖9)轉(zhuǎn)化為SQL表。

1. 直接由實體生成的SQL表有:

Division????????? Department????????? Employee????????? Manager????????? Secretary????????? Engineer???????

Technician???? Skill????????????????????????? Project??????????????? Location?????????? Prof_assoc?????? Desktop

Workstation

2. 由“多對多”二元關(guān)系及“多對多”二元回歸關(guān)系生成的SQL表有:

belongs_to

3. 由三元關(guān)系生成的SQL表有:

skill_used???? assigned_to

?

總結(jié)與回顧

1. 通過一些簡單的規(guī)則就能把ER模型中的實體、屬性和關(guān)系轉(zhuǎn)化為SQL表。

2. 實體在轉(zhuǎn)化為表的過程中,其中的屬性一一被映射為表的屬性。

3. “一對一”或“一對多”關(guān)系中的“子”端實體轉(zhuǎn)化成的SQL表必須包含另一端實體的主鍵,作為外鍵。

4. “多對多”關(guān)系轉(zhuǎn)化為一張表,包含相關(guān)實體的主鍵,復(fù)合組成其自身的主鍵。同時這些鍵在SQL中定義為外鍵分別指向各自的實體。

5. 三元或n元關(guān)系被轉(zhuǎn)化為一張表,包含相關(guān)實體的主鍵。這些鍵在SQL中定義為外鍵。這些鍵中的子集定義為主鍵,其基于該關(guān)系的函數(shù)依賴。

6. 泛化層次的轉(zhuǎn)化規(guī)則要求子類實體從超類實體繼承主鍵。

7. ER圖中的可選約束在轉(zhuǎn)化為SQL時,表現(xiàn)為關(guān)系的某一端實體允許為null。在ER圖中沒有明確標(biāo)識可選約束時,創(chuàng)建表時默認(rèn)not null約束。

?

?

?

?

參考資料

數(shù)據(jù)庫設(shè)計Step by Step (9)——ER-to-SQL轉(zhuǎn)化

?

轉(zhuǎn)載于:https://www.cnblogs.com/arxive/p/9669214.html

總結(jié)

以上是生活随笔為你收集整理的ER TO SQL语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。