我正在开展多租户网站项目。该项目将管理租户的预约。像美发师一样可能是这个项目的租户。因此,美发工具租户有工作人员和客户相关联。每个客户将由任何一名工作人员服务。
我对这种情况的数据库设计有疑问。在这种情况下,我有3个实体,即:
首先,我会告诉你我对这种数据库设计的想法,然后我想要你的专家建议。
我的想法是:
对我来说租户,员工和客户都属于同一类别,因此我为所有人确定了一张表< em>(说用户)。此表包含 TypeId 列,用于区分其中的三个。此表包含租户 - 员工和租户 - 客户的自引用关系,可能 1对多。
我的思想的视觉表现:
我不擅长数据库设计,我希望我的数据库设计尽可能好,并且可扩展。所以我在这里请你们回顾一下我的设计并告诉我这个设计的优点和缺点,如果还有其他任何设计,请为我提出一个更好的设计。
而BTW我正在我的项目中使用Entity Framework Code First。
感谢。
答案 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 | ... |
| .. | ....... | ... |
+----+---------+-----+
同一个客户可以与许多不同的租户相关联,每个租户可以拥有许多不同的客户,这个表将它们联系在一起。每列都是其各自表的外键,它们一起构成表的主键。在我的示例数据中,我们看到Mary
是Barbie's Hair Salon
的客户以及Ken's Gym
,而Greg
是Ken'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 |
| ........... | ......... |
+-------------+-----------+
您称之为员工的是我称之为员工的人,这些人是为租户工作的人。在我的示例数据中,我们看到Bob
和Mary
都适用于Barbie's Hair Salon
而Greg
适用于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 Gym
而Mary
适用于Barbie's Hair Salon
和Ken'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 | ... |
| .. | ................... | ... |
+----+---------------------+-----+
最后我们有一个包含用户信息的表格。由于customers
和employees
是users
的子集,因此我们会存储所有常见信息,例如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 | ... |
| .. | ........ | ........ | .......... | ......... | ... |
+----+----------+----------+------------+-----------+-----+