在数据库中设计 user/roles/people 的最佳实践

Best practice for designing user/roles/people in database

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

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

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

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

感谢您的帮助。

去掉 user_roleuser_role_link table 怎么样,因为你已经在其他 table 中有了所需的信息,然后你就没有了不必维护所有这些 links:

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, ...)

请注意,不再有 "role" 这样的东西,因为客户、公司和员工 "have a" 用户。所以你得到的是上面的聚合模型。

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

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

请注意,如果您丢失了 link tables,您仍然可以通过对所有三个 tables 和检查哪个 table 的 ID 字段返回一个 ID 而不是空值。一旦你知道你拥有的类型,特定于类型的代码就可以非常直接地查询,只需一个连接,user 到任何派生的 table。例如,假设您知道您有一个 clientclient 代码可以直接查询 client table 并且只需对用户进行一次连接,这就是所有需要的.

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

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

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

这是我的方式。我创建了一个配置文件 table... 并且 users/employs/clients 使用了它。 一个用户应该得到一个角色。如果你想创建用户组,你需要创建一个用户组Table。

Table"user": id_user date_created date_deleted id_role id_profile 用户名 别名 密码 password_question password_answer

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