2009-06-07 47 views
0

我有以下情形:實現在數據庫中記錄的用戶/用戶組級訪問(應用級)

1)用戶表:

int Id (PK, Identity) 
// more users table columns (firstname, etc.) 

2)羣組表:

int Id (PK, Identity)  
// more usergroups table columns (title etc.) 

3)UserGroupMembership表:

int Id 
int UserId (FK->Users.Id) 
int UserGroupId (FK->UserGroups.Id) 

以及4)聯繫表:

int Id (PK, Identity) 
// more contacts table columns.. 

我正在尋找一種方法來在我聯繫人的聯繫人表無論是 「公共」(每個人都可以看到它),或限制爲一個/多個用戶組或單個用戶的任意組合。

完全卡在這裏....幫助?

回答

1

爲什麼不使用關聯Contacts和UserGroups的附加表? 例如

ContactsAccess

int UserGroups.Id (FK) 
int Contacts.Id (FK) 

你可以使用一個特殊值(例如零(0))來表示不受限制的訪問,或者你可以修改聯繫人表指示權限類型。

+0

從 「用戶」 和2組也可能只是4個個體。那意味着用戶和聯繫人之間的另一個關係表是正確的? 這對於數據檢索來說是非常昂貴的:( – Alex 2009-06-07 05:38:24

+0

如果它需要用戶,那麼我會說額外的表是正確的選擇。 – 2009-06-07 05:39:30

0

我可能會去了解它的方式是類似於以下(MySQL的)的表:

CREATE TABLE `ContactsVisibleTo` (
    `ContactID` INT NOT NULL , 
    `Type` ENUM('User', 'Group') NOT NULL , 
    `ID` INT NOT NULL 
) 

唯一或主鍵在所有三個字段可能不是一個壞主意要麼。公共/私人之間的轉換應該是Contacts表中的字段。

0

這裏有兩種方法可以做到這一點,而無需創建額外的MN表在你的數據庫的每個實體,在其他的答案提出:

  1. 您可以添加EntityBase表,所有的實體將繼承(這意味着實體id會有1-1關係)。

    因此,EntityId(fk)將只有一個EntityAccess表連接到EntityBase表。聯繫人表將具有EntityId(fk,pk)列。你會在需要時查詢EntityBase表。

    IIRC這是VTiger CRM中使用的方法,其中有一個通用的CRMEntity表。

  2. 還有另一種方式,由MS Dynamics CRM使用。它防止爲每個實體添加中間表,但不確保參考約束。

這種方法的關鍵在於如下表所示:

PrincipalObjectAccess 
--------------------- 
... 
PrincipalId 
ObjectId 
PrincipalTypeCode 
ObjectTypeCode 
AccessRightMask 
... 

PrincipalId可能指向任何用戶ID或TeamId(團隊是隻是一組用戶)。 ObjectId可能指向模型中的任何實體,具體取決於ObjectTypeCode(無論是Contact,Account,Project等)。

AccessRightMask是二進制enumaration標誌:

Read = 1 
Write = 2 
Append = 4 
AppendTo = 16 
Create = 16 
Delete = 65536 
Share = 262144 
Assign = 524288