这种多租户数据库设计是否良好

时间:2014-01-19 08:13:08

标签: sql database database-design ef-code-first

我正在开展多租户网站项目。该项目将管理租户的预约。像美发师一样可能是这个项目的租户。因此,美发工具租户有工作人员和客户相关联。每个客户将由任何一名工作人员服务。

我对这种情况的数据库设计有疑问。在这种情况下,我有3个实体,即:

  • 租户
  • 员工
  • 客户(客户是租户的用户)

首先,我会告诉你我对这种数据库设计的想法,然后我想要你的专家建议。

我的想法是:

对我来说租户员工客户都属于同一类别,因此我为所有人确定了一张表< em>(说用户)。此表包含 TypeId 列,用于区分其中的三个。此表包含租户 - 员工租户 - 客户的自引用关系,可能 1对多

我的思想的视觉表现:

enter image description here

我不擅长数据库设计,我希望我的数据库设计尽可能好,并且可扩展。所以我在这里请你们回顾一下我的设计并告诉我这个设计的优点和缺点,如果还有其他任何设计,请为我提出一个更好的设计。

而BTW我正在我的项目中使用Entity Framework Code First。

感谢。

1 个答案:

答案 0 :(得分:0)

客户表将保存特定于客户的信息。在我的示例数据中,我们看到Mary和Greg是客户。这里我只是将一个外键存储到users表,而不是存储first_name,last_name等。我这样做是因为我们可能有一个既是客户又是员工(员工)的用户 - 我们为什么要让他们创建多个登录?显然,您希望在此表中存储更多内容。

customers
    id              unsigned int(P)
    user_id         unsigned int(F users.id)
    ...

+----+---------+-----+
| id | user_id | ... |
+----+---------+-----+
|  1 |       2 | ... |
|  2 |       3 | ... |
| .. | ....... | ... |
+----+---------+-----+

同一个客户可以与许多不同的租户相关联,每个租户可以拥有许多不同的客户,这个表将它们联系在一起。每列都是其各自表的外键,它们一起构成表的主键。在我的示例数据中,我们看到MaryBarbie's Hair Salon的客户以及Ken's Gym,而GregKen's Gym的客户。

customers_tenants
    customer_id     unsigned int(F customers.id)--\_(P)
    tenant_id       unsigned int(F tenants.id)----/

+-------------+-----------+
| customer_id | tenant_id |
+-------------+-----------+
|           1 |         1 |
|           2 |         2 |
|           1 |         2 |
| ........... | ......... |
+-------------+-----------+

您称之为员工的是我称之为员工的人,这些人是为租户工作的人。在我的示例数据中,我们看到BobMary都适用于Barbie's Hair SalonGreg适用于Ken's Gym

employees (staff)
    id              unsigned int(P)
    user_id         unsigned int(F users.id)
    sin             unsigned int // Social Insurance Number
    dob             date // Date of birth
    hired           date
    ...

+----+---------+-----------+------------+------------+-----+
| id | user_id | sin       | dob        | hired      | ... |
+----+---------|-----------+------------+------------+-----+
|  1 |       1 | 123456789 | 1995-01-01 | 2013-12-13 | ... |
|  2 |       2 | 987654321 | 1996-01-01 | 2013-10-30 | ... |
|  3 |       3 | 123459876 | 1994-01-01 | 2013-01-24 | ... |
| .. | ....... | ......... | .......... | .......... | ... |
+----+---------|-----------+------------+------------+-----+

我们需要一张将员工和租户联系在一起的桌子。该表与customers_tenants表非常相似。在我的示例数据中,我们看到Bob适用于Ken's GymMary适用于Barbie's Hair SalonKen's Gym

employees_tenants
    employee_id     unsigned int(F employees.id)
    tenant_id       unsigned int(F tenants.id)

+-------------+-----------+
| employee_id | tenant_id |
+-------------+-----------+
|           1 |         2 |
|           2 |         1 |
|           2 |         2 |
| ........... | ......... |
+-------------+-----------+

tenants表中,我们存储有关每个租户的信息。显然,你将拥有的不仅仅是一个名字。

tenants
    id                  unsigned int(P)(F users.id)
    name                varchar(50)
    ...

+----+---------------------+-----+
| id | name                | ... |
+----+---------------------+-----+
|  1 | Barbie's Hair Salon | ... |
|  2 | Ken's Gym           | ... |
| .. | ................... | ... |
+----+---------------------+-----+

最后我们有一个包含用户信息的表格。由于customersemployeesusers的子集,因此我们会存储所有常见信息,例如first_name,last_name等。

users
    id              unsigned int(P)
    username        varchar(32)
    password        varbinary(255)
    first_name      varchar(30)
    last_name       varchar(30)
    ...

+----+----------+----------+------------+-----------+-----+
| id | username | password | first_name | last_name | ... |
+----+----------+----------+------------+-----------+-----+
|  1 | bob      | ******** | Bob        | Sled      | ... |
|  2 | mary     | ******** | Mary       | Poppins   | ... |
|  3 | greg     | ******** | Greg       | Stamps    | ... |
|  4 | jen      | ******** | Jennifer   | Jones     | ... |
| .. | ........ | ........ | .......... | ......... | ... |
+----+----------+----------+------------+-----------+-----+
相关问题