2012-08-23 158 views
1

我讀過SO幾個職位有關創建一個一對一的關係:設計1個或2代表用於SQL Server中的1至(0..1)的關係

how do i create a real one-to-one relationship in sql server

is there ever a time where using a database 11 relationship makes sense?

Database design 1 to 1 relationship

,但我會很高興有這個基本的情況下,你的建議是:我有一個用戶和公司表。每個用戶可以有0或1個公司。

是更好地利用兩個表具有下列關係:

USER_COMPANY

RELATIONSHIP

還是我剛纔只使用一個表所需的所有領域:

USER

感謝您的解釋。

注意:我正在使用SQL Server(使用Manager Studio進行設置)並計劃使用EF。

更新:爲了更加明確,我試圖實現以下內容: 用戶可以擁有或不擁有公司。如果他擁有一家公司,他就是唯一一個爲之工作的人。

謝謝

+0

這裏有幾個問題。用戶是否可以隨時更換公司?如果可以的話,是否知道該用戶工作的公司對您來說很重要?一家公司能改變他的名字嗎?無論如何,你的第一個設計並沒有什麼意義,因爲'USER'這個表上沒有'CO_ID'來建立關係 – Lamak

+0

Hi Lamak,請看我的更新。感謝您的建議 – benoitr

回答

2

由於用戶而不是可能擁有一家公司,因此這不是真正的「1對1」關係。

其實,這是 「1〜0..1」,您可以在以下兩種方式之一,型號:

  1. 擁有一切在一個表:

    enter image description here

    請注意COMPANY_ID是如何UNIQUE(防止多個用戶擁有同一家公司)和NULL-capable(允許不擁有公司的用戶)。 USER_ID和COMPANY_ID的分離允許公司級別的外鍵(即允許子表引用公司,同時防止他們引用無公司用戶)。

    如果沒有公司級別的FK,則可以完全省略COMPANY_ID。

    您還需要一個CHECK來確保除非設置了COMPANY_ID(或者至少公司字段的正確子集非空),否則不能設置其他公司字段。

  2. 有兩個表:

    enter image description here

    我們不能只是有這兩個表的PK也成爲FKS(雙向),因爲MS SQL Server的簡化版,支持延遲的約束,這將是在插入新數據時需要解決egg-and-egg問題,也不能正確模擬「1到0..1」關係(它將模擬「1到1」並且不允許無公司用戶)。

這兩個策略,你應該選擇之一,很大程度上取決於相比,用戶的公司數目:

  • 如果大多數用戶擁有的公司,選擇(1)。
  • 如果用戶比公司多,請選擇(2)。
0

這取決於你將有什麼其他數據。如果這是唯一使用公司的地方,那就去一張桌子吧。如果公司在其他幾個表中使用,那麼你會希望它是一個單獨的表。

1

這實際上聽起來像一個多一對多的關係對我說:

  • 多個用戶可以爲公司
  • 用戶可以爲多個公司

也許你不攜手我不想說明後一種情況,但我不能傷害。在這種情況下,您需要一個user表,一個user_company表(n對n映射)和一個company表。如果要限制用戶到一家公司,請使user_company表中的user_id列爲唯一。

希望有幫助。

0

你的第一選擇是最好的。

  • 索引... ...性能
  • 如果用戶不是公司...
  • 如果你真的願意查詢用戶 沒有帶回公司...
  • ...反之亦然
  • 如果你將永遠有需要鏈接到用戶的其他表,但不是公司...
  • 如果你將永遠希望能夠以不同的方式固定表 (也許您的採購部門需要SELECT進入公司, 而不是用戶,你的人力資源管理部門需要的用戶訪問,但不 公司)...

有一萬個理由......但這裏有5個或6想一想/讓你開始。

0

嗯 如果你有沒有可能要求曾經有每個用戶的多個公司和大宗用戶將有一個公司,它已經沒有那麼多的領域,來描述公司的話,我會保持它簡單,並與一張桌子去。你以後可以隨時調整你的想法。

如果你想要多一點的範圍1,那麼你把userid放在company或者companyid中,你作爲option 1不會起作用,並且會導致令人難以置信的混淆代碼。

Select Company From Companies Where CompanyID = @UserID;// huh eh? What!! 

至於別人,如果你想要更多的範圍,所以你可以做CompanyID和用戶名多對多,那麼第三個表中它會被要求說。