2014-01-19 78 views
1

我正在开发一个多租户网站项目。这个项目将管理租户的任命。就像一个头发梳妆台可能是这个项目的承租人。所以发梳客户有员工和与之相关的客户。每个客户将由任何一个员工提供服务。这是多租户数据库设计好吗

我有一个关于这种情况下数据库设计的问题。在这种情况下,我有即3单位:

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

首先,我会告诉你我的想法对这样的数据库设计,然后我想你的专家意见。

我的想法是:

对我来说租客员工客户都属于同一类别,所以我决定一个表为所有这些(说用户)。此表包含一个TypeId列,它将区分它们中的三个。此表包含租户员工的自引用关系租户 - 客户可能是1到很多

视觉我的想法的表示:

enter image description here

我不是在数据库设计很好,我想我的数据库设计尽可能好的和扩展。所以我在这里要问你们,请回顾一下我的设计,并告诉我这种设计的优缺点,如果有其他情况,请为我提供一个更好的设计,以供我上面提到的场景使用。

顺便说一句,我在我的项目中使用实体框架代码第一。

谢谢。

+0

客户或员工是否要登录? – cHao

+0

@cHao员工不会登录,但客户是。但将来可能会增加员工登录。 – gaurav

+0

您可能也会考虑到他们都属于同一类别,意味着需要额外的工作来*避免*员工登录... – cHao

回答

0

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

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 GymGreg的客户是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 | 
| ........... | ......... | 
+-------------+-----------+ 

你打电话给工作人员的是我打电话给员工的,这些是为租户工作的人。在我的示例数据中,我们看到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  | ... | 
| .. | ........ | ........ | .......... | ......... | ... | 
+----+----------+----------+------------+-----------+-----+