2009-12-08 50 views
3

我有一個表USER(USER_ID,PASSWORD,NAME,...)和表ACCESS_ROLES爲用戶,每個用戶可以有一個ACCESS_ROLE(一對一)。數據庫設計,哪個表有外鍵

Wich表有外鍵嗎?
我會把USER_ID轉換成ACCESS_ROLES表。有沒有最佳實踐方法?

+0

這是一對一映射嗎? – tosh 2009-12-08 17:53:13

+2

如果是One-To-One,那麼聽起來好像所有人都應該進入同一張桌子?那真的取決於你需要什麼。 – 2009-12-08 17:59:05

+0

聽起來更像多對一(許多用戶可以有一個access_role) – 2016-08-23 17:08:20

回答

2

由於您將具有一比一的關係,由菲利普·凱利提出的解決方案是更好的。就在USER稱爲access_role_id添加一個新列,然後做這樣的USER表的外鍵:

ALTER TABLE USER ADD CONSTRAINT fk_access_roles_users 
       FOREIGN KEY (access_role_id) 
       REFERENCES ACCESS_ROLES(access_role_id); 

不要添加USER_IDACCESS_ROLES表,如你所說。

0

如果你有一對一的映射,我會把外鍵放到你將要查詢大部分時間的表中。

4

如果你有一組固定的訪問角色和任意數量的用戶,其中一個用戶分配一個且唯一一個進入角色,並且可以分配給定的訪問規則[任意數量的用戶,這是我如何理解你的問題],那麼你會在你的USERS表中放入一個類似「AccessRoleId」的列,並將一個外鍵約束添加到ACCESS_ROLES中。

+0

不應該將外鍵約束放入USER表中嗎? – 2009-12-08 18:09:01

+0

根據你的回覆,沒有。如果UserId是Access_Roles中的列,並且是用戶中的FK,那麼這意味着每個訪問角色都與一個且只有一個用戶相關聯......並且潛在地,許多用戶將不具有分配的訪問角色。 – 2009-12-08 22:36:16

+0

@DanielVassallo將外鍵約束應用於ACCESS_ROLES表,以防止人們刪除access_roles中的記錄(如果有任何引用它們的用戶記錄) – 2016-08-23 17:06:18

-1

不知道我是否理解這個問題:我認爲access_table應該有外鍵。

+0

如果您不確定該問題,請不要浪費寶貴的時間來回答這個問題。 – 2017-05-02 04:29:26

2
  • 如果每個用戶都準確(或最多)一個ACCESS_ROLE。
  • 一個ACCESS_ROLE可以有多個用戶

然後:

  • FK父ACCESS_ROLE和鏈接ACCESS_ROLES表的PK
  • FK孩子是用戶和FK列是ACCESS_ROLE列

注意:外鍵「父」列必須是唯一的約束。如果每個ACCESSROLE中,FK 多個用戶必須從USERS到ACCESSROLES

在SQL Server

ALTER TABLE USERS WITH CHECK ADD 
CONSTRAINT FK_USERS_ACCESS_ROLES FOREIGN KEY (ACCESS_ROLE) REFERENCES ACCESS_ROLES (ACCESS_ROLE /*PK?*/) 
0

您可以添加一個外鍵ACCESS_ROLES

及以下執行一個一個映射

UNIQUE (ACCESS_ROLES_ID, USER_ID) 
0

是否有任何的最佳做法Appro公司ACH?

是的,有!

primary key一樣,foreign key也是放置在表格中的一列或多列上的constraint類型。

foreign key在另一個表中的鍵列和相關列之間建立鏈接。 (您也可以將外鍵列鏈接到同一表中的列。)

包含該外鍵的表被視爲子表,並且該外鍵引用的表是父表。

要點

  1. foreign key必須引用primary keyunique constraint,雖然該參考可以是在同一個表上或不同的表。
  2. A foreign key還必須具有與引用約束中的列數相同的列數,並且數據類型必須在相應的列之間匹配。
  3. Primary key不同,Foreign key列可以包含NULL值。
+0

至少部分內容是從https://www.simple-talk.com/sql/t-sql-programming/questions-about-primary-and-foreign-keys-you-were-too-shy-請問/ - 請給原作者一分錢。 – 2017-07-04 05:53:46