2017-06-21 121 views
2

我最近開始使用MySQL Workbench來管理EER圖。直到現在我一直在使用phpmyadmin,我從來沒有遇到識別&非識別關係的條款。識別與SQL中的非識別關係

我查了一下網上的差異,並閱讀了幾個關於該主題的Stack Overflow答案,但我仍然非常無能。

從我的理解,我將舉一個我的數據庫中的場景的例子,我會提出正確的解決方案。

所以在我的數據庫中,我有一個users表,包含了各種方法來聯繫用戶一個contact表(如電子郵件&電話號碼)。由於聯繫人記錄不能與用戶無關,因此應該是,以確定的關係。

這裏是我的表是這樣的:

+-------+ +-------+ 
| users | |contact| 
+-------+ +-------+ 
| id | |id  | 
+-------+ |userid | 
      |contact| // contains email or phone 
      |type | // specifies if email or phone 
      +-------+ 

然而,當我創建一個識別兩個表之間的關係,它使複合鍵的userId一部分。我知道該表可以有一個由useridcontact組成的組合主鍵,但是希望在整個數據庫中保持一致的結構,其中每個表都有自己的代理鍵。 (我多次看到,使用代理鍵比組合鍵更好。)

因此,在這種情況下,實際執行此操作的正確方法是什麼?我應該使用組合鍵並取消代理鍵(我真的不想這麼做)?或者我應該在這種情況下使用非識別關係?

請解釋清楚這兩種關係之間的區別是什麼,爲什麼識別關係需要指向一個領域是複合鍵的一部分。

+0

你在使用什麼,它會自動爲你創建密鑰? – Barmar

+0

@Barmar「我最近開始使用MySQL Workbench來管理EER圖」 –

+0

我將不得不刪除我的答案並對其進行編輯。必須得到非vs確認使用正確。它會回來的。 「識別關係的技術定義是孩子的外鍵是其主鍵的一部分。」 – philipxy

回答

2

聽起來你有一個非識別關係,其中父項的主鍵存在於子項中,但不是子項主鍵的一部分 - 假設子項實體(contact)有其自己的生成首要的關鍵。

識別關係意​​味着父實體的主鍵是自然鍵的一部分(假設是複合的,除非實體是1:1),並且現在一般不是時尚。

在數據庫設計方面,識別與非識別在現實世界中相當罕見。我遇到或設計的大多數數據模型都在每個實體上都有一個主鍵,而其他實體的外鍵則指向它的任何對象的主鍵。偶爾,我或我知道的任何其他數據建模者會通過使用數據庫約束在自然關鍵級別強制實現唯一性。

+0

所以你說在我的情況下,我應該使用非識別關係,因爲每個實體都有自己的ID? –

+1

是的 - 如果孩子的主要關鍵是代孕 - 這將違反「識別關係」的定義 –