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

Sql 实现用户/用户组级别对数据库中记录的访问(在应用程序级别),sql,Sql,我有以下情况: 1) 用户表: 2) a用户组表: 3) aUserGroupMembership表格: int Id int UserId (FK->Users.Id) int UserGroupId (FK->UserGroups.Id) int Id (PK, Identity) // more contacts table columns.. 和4)一个联系人表: int Id int UserId (FK->Users.Id) int Use

我有以下情况:

1) 用户表:

2) a用户组表:

3) aUserGroupMembership表格:

int Id
int UserId  (FK->Users.Id)
int UserGroupId  (FK->UserGroups.Id)
int Id  (PK, Identity)
// more contacts table columns..

和4)一个联系人表:

int Id
int UserId  (FK->Users.Id)
int UserGroupId  (FK->UserGroups.Id)
int Id  (PK, Identity)
// more contacts table columns..

我正在寻找一种在我的contacts表中设置联系人的方法,可以是“public”(每个人都可以看到),也可以限制为一个/多个用户组或单个用户的任意组合


完全被困在这里。。。。帮助?

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

联系人访问

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

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

我可能会使用类似于以下(MySQL)的表:


在所有三个字段上使用一个唯一的或主键也不是一个坏主意。公共/私人之间的切换应该是
联系人表中的一个字段。

这里有两种方法可以做到这一点,而不必为数据库中的每个实体创建额外的M-N表,如其他答案中所建议的:

  • 您可以添加所有实体都将从中继承的EntityBase表(这意味着在实体id上有1-1关系)

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

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

  • 还有另一种方式,由MS Dynamics CRM使用。它阻止为每个实体添加中间表,但不能确保引用约束

  • 该方法的关键在于下表:

    PrincipalObjectAccess
    ---------------------
    ...
    PrincipalId
    ObjectId
    PrincipalTypeCode
    ObjectTypeCode
    AccessRightMask
    ...
    
    PrincipalId可以指向UserId或TeamId(team只是一组用户)。ObjectId可能指向模型中的任何实体,具体取决于ObjectTypeCode(可能是联系人、帐户、项目等)

    AccessRightMask是一个二进制枚举标志:

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

    它也可能只是来自“用户”的4个人和2个组。这意味着用户和联系人之间还有一个关系表,对吗?这在数据检索方面会非常昂贵:(如果它也需要用户,那么我认为添加一个表是正确的选择。与此表的连接仍然必须加倍(在type='Contact'…和type='Group'上)只有它的缺点是使表本身变大。双表方法具有相同数量的联接,但表较小,并且能够使用外键约束。
    Read = 1
    Write = 2
    Append = 4
    AppendTo = 16
    Create = 16
    Delete = 65536
    Share = 262144
    Assign = 524288