gpt4 book ai didi

mysql - 在数据库中设计用户/角色/人员的最佳实践

转载 作者:搜寻专家 更新时间:2023-10-30 23:45:56 27 4
gpt4 key购买 nike

我想知道在下一个场景中设计数据库表的最佳方式是什么:

我有一些公司、客户和员工具有一些共同领域,而其他领域则完全不同。最重要的是他们都有用户名、电子邮件和密码,以便能够登录管理系统。然后我想知道在表格中组织所有数据的最佳方式。此刻我在想

  • 用户(id、role_id、电子邮件、用户名、密码)
  • user_role (id, parent_id, name) -- 公司|客户|员工
  • user_role_link (user_id, role_id)
  • 公司(id、user_id、姓名...)
  • 客户(id、user_id、first_name、last_name、...)
  • 员工(id、user_id、first_name、last_name、start_date、end_date ...)

这样我只需要在用户登录时检查表 user 但我不知道是公司、客户还是员工(我必须检查所有表)。

我对此有点困惑,然后我不知道该怎么做......

感谢您的帮助。

最佳答案

如何摆脱 user_roleuser_role_link 表,因为您已经在其他表中拥有所需的信息,然后您不必维护所有这些链接:

user (id, email, username, password)
company (id, user_id, name, ...)
client (id, user_id, first_name, last_name, ...)
employee (id, user_id, first_name, last_name, start_date, end_date, ...)

请注意,不再有“角色”这样的东西,因为客户、公司和员工“都有一个”用户。所以你拥有的是上面的聚合模型。

比这更进一步,您可能会提出一种面向对象的继承方法。通过该过滤器,您将只有用户、公司、客户和员工,其中后三个是“种类”用户。事实上,在这种情况下,公司、客户和员工实际上可以与用户共享相同的 ID,因为它们本质上是相同的对象!它们都是从用户派生出来的,都是用户。 (但除非你知道自己在做什么,否则我不一定会建议这个选项。)

这就是我在这里看到的两个选项 - 聚合或继承。

请注意,如果您丢失了链接表,您仍然可以通过对所有三个表执行外部联接并检查哪个表的 ID 字段返回 ID 而不是空值来确定您拥有的对象类型。一旦您知道了您拥有的类型,特定于类型的代码就可以非常直接地进行查询,只需将 user 连接到任何派生表即可。例如,假设您知道您有一个 clientclient 代码可以直接查询 client 表,并且只需执行一个 join 到 user这就是所有需要的。

有关在传统数据库中布置面向对象数据的一些常见方法的更多信息,Python 的 SQLAlchemy 引用资料提供了一些通用方法:

http://docs.sqlalchemy.org/en/rel_0_9/

SQLAlchemy 是专门设计用于帮助解决对象关系映射问题的库,因此您可以了解它们是如何做事的。出于这个原因,我建议将其作为引用,而不是用于任何 Python 连接。

关于mysql - 在数据库中设计用户/角色/人员的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com