实现对数据库中记录的用户/用户组级访问(在应用程序级别)

时间:2009-06-07 05:29:31

标签: sql

我有以下情况:

1)用户表:

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

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

2) UserGroups 表:

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

3) UserGroupMembership 表:

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

和4)通讯录表:

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

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

我正在寻找一种方法,让我的通讯录表中的联系人“公开”(每个人都可以看到),或限制为一个/多个用户组或单个用户的任意组合。< / p>

完全停留在这里......帮助?

3 个答案:

答案 0 :(得分:1)

为什么不使用与联系人和用户组相关的附加表? e.g。

<强> ContactsAccess

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

您可以使用特殊值(例如零(0))来表示不受限制的访问,或者您可以修改联系人表以指示权限类型。

答案 1 :(得分:0)

我可能会采用的方式是一个类似于以下(MySQL)的表:

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

所有三个字段的唯一或主键也可能不是一个坏主意。 public / private之间的切换应该是Contacts表中的一个字段。

答案 2 :(得分:0)

以下是两种方法,无需为数据库中的每个实体创建额外的M-N表,如其他答案所示:

  1. 您可以添加所有实体将从中继承的EntityBase表(意味着实体ID上将存在1-1关系)。

    因此,只有一个EntityAccess表与EntityId(fk)链接到EntityBase表。联系表将具有EntityId(fk,pk)列。您可以在需要时查询EntityBase表。

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

  2. 还有另一种方法,由MS Dynamics CRM使用。它可以防止为每个实体添加中间表,但不能确保参考约束。

  3. 这种方法的关键在于下表:

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

    PrincipalId可能指向UserId或TeamId(团队只是一组用户)。 ObjectId可能指向模型中的任何实体,具体取决于ObjectTypeCode(无论是Contact,Account,Project等)。

    AccessRightMask是二进制枚举标志:

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