【问题标题】:Best practice for designing user/roles/people in database在数据库中设计用户/角色/人员的最佳实践
【发布时间】:2015-04-20 06:02:15
【问题描述】:

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

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

  • 用户(id、role_id、电子邮件、用户名、密码)
  • user_role (id, parent_id, name) -- company|client|employee
  • 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_role 表(这似乎是一个合理的想法),那么我真的看不出在 user 表中有一个 role_id 列有什么意义。

标签: mysql database database-design database-schema


【解决方案1】:

如何摆脱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 表,只需对用户进行一次连接,这就是所需要的。

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

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

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

【讨论】:

  • 不清楚你的意思你能用表名和字段做一个简单的例子吗?谢谢
  • (添加了其他示例表。)
【解决方案2】:

这是我的方式。我创建了一个 Profile 表......并且用户/雇员/客户使用它。 并且用户应该得到一个角色。如果你想创建用户组,你需要创建一个用户组表。

表“用户”: id_user 创建日期 删除日期 id_role id_profile 用户名 别名 密码 密码问题 密码回答

Table "role":
id_role
date_created
date_deleted
name (35)
description

Table "permission":
id_permission
date_created
date_deleted
name
description

Table "permission_assigned":
id_permission_assigned
date_created
date_deleted
id_permission
id_user
id_role

Table "user_session":
id_user_session
id_user
logon_date
logoff_date
ip_address (45)
user_agent (413)

Table "profile":
id_profile
date_created
date_deleted
first_name (35)
last_name (35)
sex
email (254)
phone (15)
birthday
address (40)
id_country
id_state
id_city
zip_code (10)
description

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2016-11-02
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多