2015-01-03 36 views
0

我們在應用程序中有「用戶」和「學習」實體,存儲在各自的表中。 一項研究代表了一種研究和收集到的數據。 他們有多對多的關係,所以我們需要一個鏈接表:studies_users。MySQL表(重新)設計

我們爲用戶分配角色。有一些「正常」的角色,這是依賴研究的,所以對於同一個用戶,他們可以是不同的,這取決於所選擇的研究。這意味着這些角色必須作爲studies_users表的一部分進行存儲。

然而,對於一個新的「特殊」角色的請求,我們稱它爲superadmin,這基本上意味着用戶在各種研究中都具有所有可能的角色(或權利)。這意味着這樣的屬性不必存儲在studies_users鏈接表中,它足以將其存儲在用戶表中的新列(例如is_superadmin)中,因爲它適用於所有研究。但是,如果我將它與其他角色(在用戶表中)分開存儲,它似乎有點不合邏輯並可能導致處理相關邏輯的代碼中出現不必要的複雜性。

我應該在鏈接表還是在用戶表中存儲這樣的屬性? 爲什麼?

爲表一些非常基本的SQL:

CREATE TABLE `users` (
    `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `EMAIL` varchar(100), 
    PRIMARY KEY (`ID`) 
); 

CREATE TABLE `studies` (
    `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `NAME` varchar(150), 
    PRIMARY KEY (`ID`) 
); 

CREATE TABLE `studies_users` (
    `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `STUDY_ID` int(10), 
    `USER_ID` int(10), 
    `ROLE_ID` tinyint(3), 
    PRIMARY KEY (`ID`) 
); 
+1

公平的問題,編輯帖子 –

+0

你可以發佈'create table' sql嗎? –

+0

如果您提供一些樣本數據,這將有所幫助。我還不知道什麼樣的信息角色和研究。 –

回答

1

因爲你的「超級管理員」的角色是一個特殊的角色,不喜歡你的描述,你不應該感到被迫在一起存放在其他角色同一張桌子。你可以稱他們都是角色,但這並不意味着他們是同一個角色。

最簡單的方法是創建一個存儲屬於此superadmin角色的所有用戶主鍵的表。將字段添加到用戶表中意味着在每行中存儲更多數據(甚至更糟糕,即使只有極少數用戶是superadmins)。

2

如果您將DB設計粘貼到現實世界中,則「superadmin」是用戶的屬性,功能上僅由用戶確定,因此應該以表格用戶身份進行。是的,這會給查詢增加一些複雜性,但當用戶從superadmin更改爲「正常」時,會讓您頭疼;你只需要改變一個標誌,你的數據將始終保持一致。

+0

我同意。用戶表上的布爾「標誌」將是最有效的。將user_id作爲(唯一)外鍵的單獨表也是可行的,但這是查詢中的額外連接。 – spencer7593