我有以下情况:
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>
完全停留在这里......帮助?
答案 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表,如其他答案所示:
您可以添加所有实体将从中继承的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(团队只是一组用户)。 ObjectId可能指向模型中的任何实体,具体取决于ObjectTypeCode(无论是Contact,Account,Project等)。
AccessRightMask是二进制枚举标志:
Read = 1
Write = 2
Append = 4
AppendTo = 16
Create = 16
Delete = 65536
Share = 262144
Assign = 524288