【问题标题】:What is the most efficient way to specify user permissions in a database?在数据库中指定用户权限的最有效方法是什么?
【发布时间】:2023-04-10 13:12:01
【问题描述】:

我有一个应用程序,它以 Facebook 风格的方式将用户与特定群组相关联。

例如:

用户 A 与组 1 和组 2 相关联

用户 B 与第 2 组和第 4 组相关联

用户可以为他们所属的每个组创建帖子(少量文本)。

我有两种类型的页面:登录用户的主页和每个组的页面。用户的主页显示来自登录用户所属的每个组中的每个其他用户的帖子。群组页面显示来自该群组中的每个用户的所有帖子

我不想在这里复制 Facebook,但我能想到的最接近的功能是来自 Facebook 上的一位朋友的消息如何显示在您的实时提要页面以及用户的墙上(个人资料页)。

在我的应用程序中,我有这三个模型(伪代码):

class User():
    user_name
    first_name
    last_name

class Group():
    group_name

class Post():
    post_content

就数据库可扩展性和性能而言,关联这些数据的最有效方法是什么?

1) 将每个帖子与用户和组相关联。当用户查看组时,从Post 表中选择所有帖子,其中组 ID = 当前组。当用户查看自己的主页时,查看该用户所属的组并查找属于该组的所有其他用户。然后,拉取这些用户的所有帖子。

2) 将所有帖子与用户关联。当用户查看自己的主页时,查看该用户所属的组并查找属于该组的所有其他用户。然后,从这些用户那里提取所有帖子。查看群组页面时,查找属于该群组的所有用户,然后拉取与这些用户关联的所有帖子。

3) 创建一个包含 PostID、UserID 和 GroupID 的连接表。查看组时,找到所有具有 GroupID 的帖子并拉出这些帖子。查看登录用户的主页时,找到该用户所属的所有组,然后找到属于这些组的所有用户,然后拉取这些用户的所有帖子。

所有这些解决方案似乎都需要大量额外的工作来为用户的主页提取记录。这些选项似乎都不是最好的解决方案。我敢肯定有人有这方面的经验。我希望有大量的帖子,所以我希望数据库可以扩展以支持 X 条记录。

有没有更有意义的方法来做到这一点?大公司如何设法做同样的事情并尽量减少开销?

【问题讨论】:

  • 在2)解决方案中,帖子所属的组,没有用户无法确定,在您的业务模型中是否正确?如果用户所属群组发生变化,帖子所属群组也会发生变化。

标签: database database-design scalability relational-database


【解决方案1】:

你没有说明你有哪些 dbms。

使用内置安全(权限)系统的 ISO/IEC/ANSI SQL 数据库,您不需要这些,只需使用 SQL 工具设置权限即可。它是内部的并且非常快。

如果您想要性能、可扩展性和数据完整性,则需要放弃对象和类的想法,并了解一点关系数据库。此外,如果您将数据建模为关系数据库(而不是对象类),上述 90% 的问题将不存在。

如果您不明白我在说什么,请阅读recent post(从 2010 年 12 月 11 日标题开始)。

有没有更有意义的方法来做到这一点?大公司如何设法做同样的事情并尽量减少开销?

是的,当然。它没有任何意义。有意义的是对数据进行正确建模,因为归一化模型总体上要快得多。这会产生更多、更小的表,而不是更少的胖表;算术和物理定律起作用。没有数据重复意味着没有更新异常,这意味着事务更小并且不太可能阻塞(您确实希望允许多个用户并发访问,对吗?)。

此外,您的编码会受到阻碍,因为您无法弄清楚数据与其他数据之间的关系。在您的问题中抛出您的实体(所有页面的数据内容)(编辑并添加到它),我们可以试一试。我可以看到User,Group,Post,但是Wall呢;任何其他家具; Photos,Albums.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2016-09-02
    • 1970-01-01
    • 2018-12-18
    • 2010-09-24
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多