0

在多個數據庫表中維護唯一ID字段的最佳方法是什麼?數據庫設計 - 如何將FK關係設置爲2個表中的1個?

我的數據庫同時包含企業和人員,而且這兩個實體都需要有一個與之關聯的唯一ID字段。此外,還有其他表格(例如地址)可以引用業務或使用其ID作爲外鍵的人員。

一些想法我想到的是:

  • 使用時插入一排被計算的非自動編號的ID字段。這將解決我獨特的問題,但隨後我想要通過相關屬性(例如地址)查找某些內容時,我必須檢查兩個表中是否包含我正在查找的記錄。

  • 在AutoNumber ID中添加一個前綴以標識要查找ID的表,但是那麼在關聯表中我的ID字段可能會變成字符串或包含與它們關聯的表的標誌,而我不知道這將如何影響性能。

  • 將人員和企業合併到一張表中。我的問題是人和企業有不同的屬性,需要單獨的字段,這種情況違背了我的本性,因爲我更喜歡爲單獨的實體分開表。

  • 創建一個主表,其中包含一個唯一的ID字段,Person或Business的ID字段以及一個標記來說明它是哪一個。然後使用該ID作爲我的外部參考#和所有關聯的表中。

  • 處理這個,我不知道一些更好的辦法,因爲我不是一個DBA

什麼解決方案我去需要能夠輕鬆地處理大量的記錄(在數據庫這是要取代有幾百萬條記錄),並在MS Sql服務器

+0

你是說當引用外鍵時,列需要以某種方式指示該鍵是業務還是人(即是否在業務表或人員表中查找鍵)? – CodingGorilla 2010-06-18 19:07:38

+0

我認爲前兩個答案錯過了將FK指向2個獨立表中的1個的觀點。 – MJB 2010-06-18 19:09:47

回答

6

那麼你不能用該設置設置外鍵。單個外鍵不能引用兩個可能的不同表。

我會做下列之一:

你當然可以使用兩個單獨的列在礦井各德兩個實體的地址表froe。 BusinessId和peopleid。 FK可以有空值,所以這可以。然後,您可以執行FK關係,從而避免出現數據完整性問題。或者建立一個同時包含企業和人員,但只有很少領域的父表格(只有那些他們真正有共同點 - 甚至可能只有一個uniqueid和一個記錄類型)的父表格,那麼你可以爲商業,人員和其他人創建子表格,地址等。

或設置個人子表 - 業務和業務地址,人員和人員地址等等。然後,您不需要保持兩個邏輯實體之間唯一的ID。

我忘了一種可能性,如果你有多對多的關係,你可以有Address,Business,People,然後是一些鏈接表,BusinessAddress,PeopleAddress。 如果我有另一種選擇,我個人不會使用GUID,因爲它們會損害性能。

+0

我很高興你的答案處於頂端 - 其他人在沒有仔細閱讀的情況下進行了投票表決,並沒有解決這個問題,在我看來。 – MJB 2010-06-18 19:25:56

+1

+1,其中規定地址不是業務/人員父表的子類型。 – 2010-06-18 19:29:40

+0

同意賈斯丁,只有頂級實體會在父表,Busineses,人。 – HLGEM 2010-06-18 19:30:54

1

這是GUID的用途。

+1

我可能是錯的,但我認爲你誤解了這個問題。標題可以改寫爲「我如何將FK關係設置爲2個表格中的1個?」 – MJB 2010-06-18 19:16:41

+0

我去改變我的標題,發現有人已經這樣做了....我不知道別人可以編輯你的帖子 – Rachel 2010-06-18 19:28:58

+0

@Rachel - 它需要一定的聲譽(2k?)來編輯除你的職位以外的職位擁有。我猜可能是根據我在評論中提出的建議做出的。 – MJB 2010-06-18 19:32:35

1

這樣做有幾種不同的模式,但最簡單的和最靈活的是使用唯一標識符(GUID);大多數數據庫都有一些用於構建這些數據庫的功能(例如,SQL Server是NEWID())。他們比其他身份證表格更大,但他們會做你正在尋找的工作。

+0

請參閱我的評論re:上面的GUID。我認爲標題引導讀者走下一條路,而問題的文本則解決另一條路。 – MJB 2010-06-18 19:17:18

+0

除了性能問題,我還需要將ID用作引用實體的內容,而GUID很難記住或寫下來。 – Rachel 2010-06-18 19:27:16

1

某些數據庫允許您使用具有空值的外鍵。有些不,我不記得是否SQL Server。如果你允許的話,你可以在地址表中有2個ID列,一列指向人,另一列指向商業。這種方法也有利有弊;其中一個缺點是它可能被你的DBA所詬病,但如果你的數據庫允許的話,那麼它可能是其中一種選擇。

2

你也可以反轉你的想法。

而不是讓地址有人或商業ID,人或企業有地址ID。

這是在我的書中一個更自然的思考方式......一個人有一個地址。

+0

如果存在多個地址,那麼這將不起作用。 – HLGEM 2010-06-18 19:17:15

+0

在這種情況下,多對多...作爲地址可能會有多個人。 – 2010-06-18 19:19:01

+0

我確實與地址有多對多的關係,我只是簡化了問題。 – Rachel 2010-06-18 19:21:07

0

GUID是唯一標識符,沒有別的。
GUID的問題是它們的大小,特別是如果你的數據庫將會很大。
它們不應用於連接(索引,外鍵,...)。
我們有這個確切的數據庫設計,當記錄數量變得太大時,我們必須改回整數。
我還要指出,你需要小心你的設計爲你的人/企業/地址。這是一個多對多的關係。業務/人可以有超過1個地址,地址可以是多個企業/個人...

如果你想保持企業和個人分開,你可以有2個表PersonAddressBusinessAddress到保持關係,兩個查找的地址時,你就必須做一個工會,或者你可以有一個表EntityAddress與講,如果它是一個企業或一個EntityNature場一起這兩項業務的人人。

1

創建一個「超類型」表,用於標識企業和人員,並用您的外鍵引用該表。這是一種常見的情況。參見:Party Data Model

0

Businessess和人真的是完全獨立的業務?

他們沒有什麼共同點,甚至不是「他們出生的那一天」?

業務不會將它們視爲「交易對手」?

我試圖說明的是,您在業務上看起來足夠堅硬,沒有平均IT(所謂的)「專業」通常看起來經常發生的盲眼鏡片,那麼您將很快找到共同點你正在尋找。

在數據庫中定義一個表來記錄這些共同點(即使它不過是標識),並使地址引用該表。