存储具有特定查看权限的用户之间的关系

时间:2012-07-07 18:21:15

标签: mysql sql database-design

我正在为MySQL设计一个数据库,以便在应用程序的两个用户之间创建关系。我不确定存储这种关系细节的最佳方法,尽管我目前打算在名为RELATIONS的链接表中使用每个关系一个记录。每个用户都拥有存储在USERS表中的基本数据,如姓名和职业,以及FK在其他表中存储的更具体的个人数据,我们称之为OTHER1,OTHER2和OTHER3,它们都包含其他一些数据为了共享,我们将在名为[Data]的字段中说出每个字段,并使用ID和USER_ID进行标识。

难点在于应用程序允许用户指定他们向每个用户显示的基本和高级数据,反之亦然。 RELATIONS链接表需要为两个用户设置FK到USERS以建立关系,但我不知道如何最好地指定每个用户能够共享的数据,因为几乎所有数据库存储的数据都是存储可选,但所有需要可能对没有查看权限的用户隐藏。然而,第二个用户应该能够看到那里是否有数据,以便他可以请求查看它的权限。

此时我的关系模型如下所示:

关系

ID
USER_ID1
USER_ID2
USER1OTHER1_ID [(Value), Unshared, Null]
...
USER1OTHER100_ID [(Value), Unshared, Null]
USER2OTHER1_ID [(Value), Unshared, Null]
...
USER2OTHER100_ID [(Value), Unshared, Null]

因此,如果User1与User2共享,USER1OTHER1_ID将包含FK到OTHER1,如果存在但未取共享则为“非共享”,如果User1在OTHER1中没有数据则为Null。 USER2OTHER1与User1共享相同。我不喜欢有一个庞大的字段数组,如果User1稍后决定将数据添加到OTHER1,我不喜欢如何更新所有关系。是否有更简单,更规范的方式来表示这个?

4 个答案:

答案 0 :(得分:3)

我认为规范化的方法是只存储userA是否有权查看userB的数据,而不是在Relations表中添加对它的FK引用,因为你已经在其他地方引用了userB的数据。通过在Relations表中存储其他引用,您正在复制数据,并且必须确保它按照您在问题中描述的那样保持同步,这可能是一个持续的维护麻烦,并且在您重构代码时还需要记住一件事

如果您只在Relation表中存储权限(无fks),您将加入表(User?)以获取用户的共享数据或根据权限查看它是否存在。

就关系表上的列数过多而言,我不认为在查询表时你会看到真正的降级(你可以纠正我)。为了清楚地说明db代码以及你的应用程序代码,我认为你最好为每个权限设置一个列,而不是试图找到一个捷径,例如将它们组合在clob或其他东西中。

答案 1 :(得分:0)

我可以轻易想象的最简洁的方法是存储一个带有关系的INT,这是权限的逐位表示;在代码中解释了INT。 INT将需要与您拥有唯一权限一样多的位,然后为每个位定义常量。我不确定你在用什么语言实现,但是有几种方法可以让这只猫变脸......

因此,一些伪代码可能如下所示:

define RELATION_PERMISSION_SEE_MY_PHOTOS = 1;
define RELATION_PERMISSION_SEE_MY_FRIENDS = 1<<1;
define RELATION_PERMISSION_SEE_MY_EMAIL = 1<<2;

然后构建一些支持信息的数组(比如本地化的字符串等)来构建你的接口,然后做这样的事情来修改它:

int new_permission = 0
foreach(user-selected-permissions as selected_permission) {
  new_permission |= selected_permission
}
my_relation_model.permissions_flags = new_permission

答案 2 :(得分:0)

一种方法是使用基本上键值对..

与此类似:

user_1_id
user_2_id
field
privilege

答案 3 :(得分:0)

  

..因为几乎所有数据库存储的数据都可以选择存储......

考虑到这一点,我建议 6NF 用于所有用户属性。

  • User表用作锚点,理想情况下只包含UserID

  • 每个用户属性都有自己的表格,只有UserID和属性值( 6NF );只有在指定了属性(所有属性值都是非空)时才存在行。

  • 每个属性还有一个仅包含OwnerID, VisitorID的共享表。仅当所有者与访问者共享属性时才存在行。


enter image description here


  • 在此模型中,用户只能共享存在的属性。如果您想允许共享未指定的属性,请将OwnerID指向User表格。

为了使事情更简单,你可以(应该)为用户数据创建一个视图。

相关问题