2017-03-11 57 views
1

我需要保存一個「用戶」表,其中一個用戶可以屬於許多「組」。在每個組中,用戶都有一組特定的設置。如何在關係數據庫中表示「活動組」關係?

使用Group表,User表和UserGroupSettings交叉引用表可以很容易地實現這一點。這裏沒有問題。

我正在努力解決的問題是如何表示用戶和他們當前「活動」的組之間的「活動組」關係。用戶可以處於不活動狀態,也可以一次在一個組中處於活動狀態。當它們不活動時,它們的UserGroupSettings被維護。

在User表中有一個可爲空的「active_group」列的顯而易見的方法看起來並不理想,因爲數據庫模式不會強制UserGroupSettings表中的行必須存在於任何給定的Group和User ID。同樣,在User表中有一個「settings_id」外鍵列不會強制它指向的設置行實際上引用同一個用戶。

是否有最佳解決方案?

  1. https://en.wikipedia.org/wiki/Associative_entity
+0

我不明白這個問題。如果UserGroupSettings中有一行,用戶將在組中處於非活動狀態。您還可以將'UserGroupSettings'的外鍵參考返回到'User.ActiveGroup'。 –

+0

無論User.ActiveGroup設置爲什麼,UserGroupSettings中的用戶設置都存在。例如,你可以成爲2個俱樂部的成員,但你只能一次,或者不能(NULL)。 問題是我不想編寫代碼來手動維護的前提條件是當User1.ActiveGroup設置爲Group1時,UserGroupSettings表中的(User1,Group1)總是有相應的條目。 – nly

+0

。 。這很容易使用外鍵引用來處理。 –

回答

0

這聽起來像你需要的,比如說,user_active_group表,引用這些用戶組設置的外鍵。

沿着這些線的東西。 。 。

-- Assumes {group_id, user_id) is unique. 
create table user_group_settings (
    settings_id integer primary key, 
    user_id integer not null, 
    group_id integer not null, 
    bunch_of_settings char(1) not null default 'X', 
    unique (user_id, group_id) 
); 

create table user_active_group (
    -- This primary key constraint means each user can have only one row. 
    user_id integer not null primary key, 
    group_id integer not null, 
    -- This foreign key constraint means there must also be a row in user_group_settings. 
    foreign key (user_id, group_id) references user_group_settings (user_id, group_id) 
    on update cascade, 
    active_group varchar(5) not null 
); 

級聯更新似乎是明智的。級聯刪除更多依賴於應用程序。