關係型資料庫設計/關係
表中的每一行都代表關於世界的事實,這些事實涉及多個值之間的關係。例如,下表包含一行,將數字 75、字串“Alice”和工程部門關聯起來。該表適用於儲存此資訊,因為使用該資料庫表的企業已經就以下規則達成一致:每個員工都有一個唯一的編號,並且每個員工都屬於一個部門。需要儲存的資料的“形狀”完美地適應於該表。
| 員工編號 | 姓名 | 部門 |
|---|---|---|
| 75 | Alice | 工程 |
| 84 | Bob | 市場營銷 |
| 98 | Charlie | 銷售 |
但是,表中的所有行都必須具有相同數量的列,並非關於世界的所有事實都可以表示為固定數量事物的組合。例如,假設我們有一個用於 CRM 應用程式的資料庫,該應用程式跟蹤客戶公司以及我們在每個公司中的各種聯絡人。一家公司可能與其關聯了七個聯絡人,而另一家公司可能只有一個聯絡人。更糟糕的是,我們可以新增和刪除公司聯絡人,並可能更改此數量。如果所有公司都將位於同一張具有固定列數的表中,那麼我們就無法將聯絡人資訊放入其中。
ER 圖允許將簡單的主語謂語賓語語句對映到圖表上,然後對映到書面的模式定義中,例如,SQL 資料庫定義語句。
例如:需求語句
一家公司擁有多家諮詢服務業務,每家諮詢服務業務都由一位經理、前臺工作人員、按服務費百分比計酬的合同諮詢師以及協助每位諮詢師提供擴充套件服務的助理組成。所有承包商和固定工資的助理都必須具備正式資格。該企業的客戶同意記錄其人口統計資料,因為服務通常涉及一些後臺處理,這些處理無法在諮詢期間立即完成,但需要在服務產品完成後由諮詢師傳達給客戶。
如何開始對映?
在 ER 對映中,2 個實體之間存在關係,這種關係類似於主語和賓語之間的動詞。例如,從上面的需求陳述中,可以生成多個更簡單的陳述,這些陳述採用主語謂語賓語格式。
公司擁有許多服務業務。
服務業務從地點運營。
服務業務擁有電話聯絡方式。
電話聯絡方式是型別化的。
一位經理管理一家服務業務。
許多辦公室工作人員經營服務業務。
辦公室工作人員獲得薪水。
辦公室工作人員有一個花名冊。
一位辦公室工作人員有一組工作班次。
一位辦公室工作人員執行許多工作班次。
許多工作班次實現一個工作班次。
已經,簡短的需求陳述產生了許多可用於 ER 對映的句子。
下一步似乎是將每個句子的主語或賓語對映為實體,該實體隨後對映到關係或表。該符號是用矩形包圍的主語名稱。
此外,連線主語和賓語的動詞可以對映到關係,關係有自己的象形圖,即菱形,動詞在其中。關係可能會對映到表中,但最常對映為一個表中的外部索引鍵,引用另一個表。
關係象形圖的每端通常都標記為描述此關係邊的基數。基數在一側可能是1,而在另一側可能是many或*,這意味著與 many 側的實體匹配的表將承載指向1 基數側的實體的外部索引鍵。
例如:公司擁有許多服務業務。
注意有一個箭頭表示主語謂語賓語順序的方向。
這將對映到類似於以下內容的內容
Corporation( Corp_Id , CorpName , GovtBusinessRegoNumber ) , Service_Business ( SB_id , Address, Corp_Id)
此處帶下劃線的屬性是其擁有實體的主鍵列。Service_Business 的最後一列是公司的外部索引鍵,代表“擁有”關係菱形中的資訊。
現在,如果公司可以將服務業務出售給彼此,那麼可能適用一段所有權時間,因此擁有關係必須進行兩個更改:開始和結束屬性,並且由於一家服務業務可以透過不同的擁有關係例項被許多公司擁有,因此擁有關係的左側基數變為many。
ER 圖中的屬性通常建模為一個橢圓,其中包含屬性名稱,並連結到包含該屬性的實體或關係。
_____ _____
________ ( start)-- ---- ( end )
(CorpName)---- """""" \ / """""
"""""""" \ V
------ \ ^ _________
(RegoNo)-- ---------------- / \ ------------------ ---- ( address )
====== \ | Corporation |--many--<Owns>--- many -->| Service_Business | """""""""
---------------- \ / ------------------ ---- _____________
V | 1 (business_name )
has =============
| many ________
------------------ ----( number )
| contact_number | ========
------------------ ---- ---------
( type )
"""""""""
以上情況有幾個不同的 ER 設計選擇,這些選擇存在爭議。Corporation.RegNo、Service_Business.Business_name 和 Contact_number.Number 是屬性,但它們也帶下劃線,因此是各自實體的主鍵。
擁有關係已成為多對多關係,可以表示為 Owns (start, end, RegNo, Business_name)。
同樣,使用了語義主鍵,但指向公司和服務業務的外部索引鍵包含在主鍵中。
如果公司可以多次擁有服務業務,那麼存在什麼樣的多值依賴?
如果存在多值依賴,那麼 RegNo、Business_Name 可以出現多次。這是否違反了 4NF,因為 RegNo、Business_Name 不是 Owns 的超鍵?
4NF 還有另一個標準,是什麼?