2016-02-19 24 views
0

比方說,我有一個包含兩個表(User和Store)的數據庫。 讓制定規則:數據庫中的外鍵或布爾值

  1. 用戶必須屬於一個商店
  2. 商店可以有一個或多個用戶

一個店雖然可能有一家商店的經理。什麼是最好的方法呢? 在Users表中添加'is_store_manager'布爾列,或者在Store表中創建一個類似manager_user_fk的外鍵?我想這會創建一個多對多的關係,但這會很糟糕,但這對於選擇我認爲的用戶來說是一個穩固的限制。最好的方法是什麼?

+0

我個人建議添加一個名爲'Role'的表和一個名爲'UserRole'的鏈接表。基於標誌的方法肯定不會擴展,例如,您可能在大型商店中有一位副店經理。擁有鏈接表UserRole將允許用戶擁有多個角色。 – Jaco

回答

1

請勿在Store上創建fk。這有點多餘,會使一些未來的SQL查詢更難。

您可以添加另一個表,UserTypeManagerNon-Manager類型。然後,您可以在指向UserType的Users表上添加一個fk。

編輯:

如果你想要一個用戶被允許多個角色,你得找別的join table

讓我們叫的,而不是UserType上表表Role,並添加另一個表,UserRoleUserRole之間的連接(它只有2列:一個外鍵User和外鍵Role採用這種設置,你不會有User選項卡上的任何FK le,因爲這個連接表將包含關係的所有信息。然後,用戶可以擁有儘可能多的角色。

+0

看起來像個好主意。但是如果我想要一個用戶同時擁有「store_manager」和「system_admin」這個角色呢?我會怎麼做? – Markinson

1

替代接受的解決方案,只允許用戶屬於一種類型,您可以使用我一直在做的工作來替換布爾狀態字段。創建一個名爲UserManager的表,主鍵也是用戶的外鍵。

任何用戶UserManager中的條目都是經理。要讓管理員只需加入UserManager的用戶表。這也可以讓你存儲更多的元數據(即你可以在用戶成爲經理時存儲)。

然後,如果你想要一個AdminUser表,你可以做同樣的事情。 AdminUser表中的任何用戶也是管理員。你可以有一個用戶(或沒有,或一個)。隨着存儲更多關於類型的元數據。

+1

這聽起來相當聰明,正如你注意到存儲更多元數據一樣。謝謝你的加入! – Markinson

+0

這與接受的答案不一樣,只是你的類型不是動態的。您也可以通過使用直通表將元數據存儲在接受的答案上。但是你可以存儲的元數據必須是相同的類型。如果你有一個多元化的方法,那麼你可以有不同類型的元數據。 – dalore