在关系数据库中通常如何实现查看权限?

Aar*_*ken 5 database database-design relational-database

设置项目权限的标准关系数据库习惯用法是什么?

\n\n

答案应该是笼统的;但是,它们应该能够应用于下面的示例。一切顺利:添加列,添加另一个表\xe2\x80\x94,只要它运行良好即可。

\n\n

应用/示例

\n\n

假设 Twitter 数据库非常简单:我们有一张User表,其中包含登录名和用户 ID;我们有一个Tweet表,其中包含推文 ID、推文文本和创建者 ID;我们有一个Follower表,其中包含被关注者的 id 和关注者。

\n\n

现在,假设 Twitter 想要启用高级隐私设置(查看权限),以便用户可以准确选择哪些关注者可以查看推文。设置可以是:

\n\n
    \n
  • 推特上的每个人
  • \n
  • 只有当前的关注者(当然必须得到用户的批准,但这并不重要)编辑:当前,我得到了一个新的关注者,他看到了;我删除了一个关注者,他就不再看到它了。
  • \n
  • 特定关注者(例如,用户 ID 5、10、234 和 1)
  • \n
  • 只有主人
  • \n
\n\n

在这种情况下,表示查看权限的最佳方式是什么?优先级依次是查找速度(您希望能够快速找出要向用户显示哪些推文)、创建速度(您不想花很长时间来发布推文)以及高效使用空间(每次我向关注者列表中的每个人发布推文时,我不必为某个表中的每个关注者添加一行。)

\n

Ale*_*lli 1

看起来像一个典型的多对多关系——我没有看到任何你想要的限制,可以节省空间,即典型的关系数据库惯用语,即一个具有两列的表(两个外键,一个进入用户,一个进入推文)...因为当前的关注者可以并且确实一直在变化,所以向发布时当前的所有关注者发布一条推文(我想这就是你的意思?)确实意味着添加该关系表中有许多(极短)行(另一种方法是保留关注者集的时间戳历史记录,以便您可以在任何给定的推文发布时间重建谁是关注者,这在时间上肯定更糟,但在空间上并没有明显更好)。

另一方面,如果您想在查看时(而不是在发布时)检查关注者,那么您可以人为地创建一个特殊的用户 ID,表示“当前用户的所有关注者”(就像您将有一个含义“Twitter 上的所有用户”);在这种情况下,快速查找所需的 SQL 看起来很麻烦但可行(UNION 或 OR 与“我是作者的关注者的所有推文,并且该推文可由[代表的人工用户 ID]所有关注者读取” ”)。我不会深入探讨SQL 的迷宫,除非您确认这是您所考虑的特殊含义(而不是简单的含义,对我来说似乎更自然,但不允许在关系上节省任何空间)表“向所有关注者发布推文”操作)。

编辑:OP 已澄清他们的意思是我在第二段中提到的方法。

然后,假设userid是表的主键Users,该Tweets表有一个主键和每条推文作者的 userid 的tweetid外键,该表是一个典型的多对多关系表,有两列(两个外键都是)和,该表是一个不太典型的多对多关系表,仍然有两列——外键插入is 列,外键插入is 列(唷;-)。两个特殊用户和是用上述含义定义的(以便向每个人、所有关注者或“只是我自己”发帖,都只添加一行——只有选择性发帖到 N 个人的特定列表才会添加 N 行)。authorFollowersUsersfollowerfolloweeCanreadUsersreaderTweetstweet@everybody@allfollowersCanread

因此,我认为用户@me可以读取的推文 ID 集的 SQL 类似于:

SELECT Tweets.tweetid 
  FROM Tweets
  JOIN Canread ON(Tweets.tweetid=Canread.tweet)
 WHERE Canread.reader IN (@me, @everybody)

UNION

SELECT Tweets.tweetid 
  FROM Tweets
  JOIN Canread ON(Tweets.tweetid=Canread.tweet)
  JOIN Followers ON(Tweets.author=Followers.followee)
 WHERE Canread.reader=@allfollowers
   AND Followers.follower=@me
Run Code Online (Sandbox Code Playgroud)

  • @aharon,Facebook 使用关系数据库吗?我认为,就像所有流量非常大的网站(包括 Twitter)一样,他们也加入了 NoSQL 潮流(正是出于可扩展性的原因)。 (2认同)