Database design 有关权限/可见性的库数据库设计问题
我正在创建一个画廊。我希望用户能够选择谁可以按组或个人查看他们的照片。我想我应该有一个表Database design 有关权限/可见性的库数据库设计问题,database-design,Database Design,我正在创建一个画廊。我希望用户能够选择谁可以按组或个人查看他们的照片。我想我应该有一个表can\u see,有两列(用户id,照片id)。这应该适用于个人,但如果我把group\u ids也扔进去,它就不起作用了。我认为最好的方法可能是在选择组时将所选组中的每个人添加到该表中,而不是将其group\u id。但是,这会在表中创建更多的条目,以便以后进行筛选。这仍然是最好的方法吗 以下是我的想法: users: id, username, ... photos: id, album_id, ..
can\u see
,有两列(用户id,照片id)
。这应该适用于个人,但如果我把group\u id
s也扔进去,它就不起作用了。我认为最好的方法可能是在选择组时将所选组中的每个人添加到该表中,而不是将其group\u id
。但是,这会在表中创建更多的条目,以便以后进行筛选。这仍然是最好的方法吗
以下是我的想法:
users: id, username, ...
photos: id, album_id, ...
albums: id, user_id (owns all photos in album), ....
can_see: user_id, photo_id
groups: id, user_id(owner), name
member_of: user_id, group_id
如果您想减少要搜索的条目数量,我将采用以下方法
User Table - UserID, UserName
Group Table - GroupID, GroupName
User Group Table - GroupID, UserID
Photo Table - PhotoID, UserID
如果您希望访问特定用户的照片,则可以从用户表中获取用户ID,并根据该ID在照片表中进行查找
如果要访问组的照片,可以从用户组表中获取用户ID,并在照片表中查找这些ID
***详细评论
好的,让我给你解释一下……好了
这里有几项行动
由照片所有者或至少由
这是我的理解。
1.照片所有者可以向单个用户授予viwership访问权限。
这将在用户表中创建一条新记录
对于新用户。对于现有用户来说
不会。这也将创建一个新的
在照片表中用
现有或新创建的用户ID。
2.照片所有者可以向一组用户授予查看权限。
此操作将在中创建新记录
新组和的组表
现有的组不会。有新用户吗
在小组中,将需要新的记录
添加到用户表中。
最终,照片桌将被打开
更新了尽可能多的记录
是组中的用户
现在要访问这些照片…有
多个案例
我想到的另一个解决方案是,我们可以将
can\u-see
表扩展为包含group\u-id
列,然后检查用户是否可以看到照片:
SELECT 1 FROM can_see WHERE user_id=USERID AND photo_id=PHOTOID
或
这是一个额外的列,通常可能是
null
,这意味着我们必须进行2次查询,而不是1次查询来检查权限,但它使可以看到的表稍微小一些,这意味着您可以在设置权限后修改组。我认为您或我有误解。我们没有搜索照片,我们正在尝试确定谁有权查看照片。使用此设置,您将如何执行此操作?我甚至不知道“用户组表”是如何工作的。如果我有5个用户都属于同一组,会发生什么?组名重复了5次?那只是个糟糕的设计。我会用我的设置来回答我的问题…同意。正如您正确指出的那样,我以前设计的重复组名的用户组表不是一个好的设计。我对设计做了一些修改,以反映我的实际想法。我所说的搜索实际上是指访问。我还是不明白。你让它听起来像是个人用户拥有照片,或者是整个用户拥有照片。如果用户A上传了照片B,然后出现了想要查看照片B的用户C。我们如何检查他是否有权限这样做?根据你的说法,我们从用户表中调出他的用户ID,然后检查照片表。。。但是照片表只是描述了谁拥有它。您仍然缺少可见性表。根据我的设计,照片所有者将为其他用户或组提供查看照片的访问权限。在您的示例中,这将是用户A向用户C授予查看其照片B的权限。这将反过来在用户表和照片表中创建一个条目。有了这个用户B应该能够查看用户A的照片B哦。。。你的照相桌是我的,你能看见吗?我以为它也在储存照片信息。为什么它同时在用户表和照片表中创建一个条目?团体的事情仍然没有任何意义。“访问群组照片”是不对的。这是“如果一个团体的成员要求看一张照片”。。。为什么我们要对照照片表检查多个用户ID?我们只想检查一个特定的用户是否可以看到它?你不必费心回答这个问题,我们只是看起来意见不一致。
SELECT 1 FROM can_see JOIN member_of ON can_see.group_id = member_of.group_id WHERE member_of.user_id=USERID AND can_see.photo_id=PHOTOID