2012-01-25 145 views
1

我有DB很少權限表形式:可選外鍵 - 這是一個很好的解決方案嗎?

UserId, Object Id, lot of bit fields 

我添加的用戶羣體我的數據庫,我需要更新的權限與用戶和用戶組的工作。我想到了兩種方法。

  1. 創建每個權限表的副本,併爲每個對象權限2個表(用戶和組權限) - 在每個表中我有一個外鍵的許可所有者的表(一個表中 - 到用戶和在第二表中的用戶組):

    UserId NOT NULL, Object Id NOT NULL, lot of bit fields 
    GroupId NOT NULL, Object Id NOT NULL, lot of bit fields 
    
  2. 一個場(的GroupId)添加到每個權限表,並使用字段中的一個(用戶ID或GroupId的)來識別,如果它是用於組或用戶權限。因此,我將有兩個外鍵的表格 - 用戶和用戶組,但對於每條記錄,只有其中一個FK將被使用 - 其他將爲空。 表可以是這樣的:

    UserId NULL, GroupId NULL, ObjectId NOT NULL, lot of bit fields 
    

什麼是你認爲最好的解決辦法?兩者的優缺點是什麼?還有其他更好的解決方案嗎?
編輯:我需要知道如何處理用戶和組的外鍵,而不是位字段。

回答

2

如果可以授予這兩個設置的權限類型總是相同的,我可能會將它保留在同一個表中。但要確保你增加一個檢查約束:

UserId int NULL, 
GroupId int NULL, 
constraint CK_CorrectFKs CHECK (
    (UserId is null and GroupId is not null) or 
    (UserId is not null and GroupId is null) 
), 
ObjectId int NOT NULL, lot of bit fields 

或者,你有沒有考慮模擬組,因爲用戶 - 無論是剛修改Users表直接接受團體或具有組表(用「組僅」列)引用Users表?這可能是一個更簡單的途徑(例如,取決於數據庫的哪些其他部分只需要與用戶一起工作)。然後,您的所有權限檢查都可以是「這裏是一個ID列表(其中一個是用戶,其他是組),請爲此用戶計算出聚合權限」。

0

我會做了第三種選擇,這是改變你的位域TINYINT(在INT家庭或varbinary東西會工作很好,但你可能只需要2-3個標誌),並使用bitwise operators(無轉換將是必要的)檢查安全級別。這不會添加列或表。

我通常會在同一資源需要多種訪問控制組合時執行此操作。例如,我將有一個名爲calendar_permissions的int列,並從最低位到最高位分配視圖(1),添加(2),編輯(4),刪除(8)以下值。所以如果我想檢查刪除權限,我會做一個「intvalue AND 8 = 1」條件。 (如果用戶具有所有權限,則該值將爲15 = 8 + 4 + 2 + 1)

在您的情況下,1將是用戶權限,2將是組權限,並且可選3將是用戶,組權限。如果您對使用這種按位算術的應用程序不滿意,可以通過視圖公開它。

由於您將2定義爲組權限,因此檢查「用戶」權限的調用應迴向兼容,因爲整數值1會轉換爲true。

(可選)您可以對這些字段進行檢查約束,以限制對您的應用程序有意義的值。

PRO:沒有額外的列/表,與當前系統兼容。 CON:不是人類可讀的,有些人在按位運算時遇到問題。您可能必須創建一個視圖才能讓任何人實際使用它。

相關問題