Mysql共享列以减少重复

时间:2016-06-04 13:55:25

标签: mysql database design-patterns database-design laravel-5.2

我试图了解构建具有许多共享列的关系数据库表的最佳方法,还有一些额外的列。 Similar to this question on Laracasts

例如,假设我有一个包含以下列的用户表:

|---------|
|  User   |
|---------|
|Name     |
|Email    |
|Password |
|DoB      |
|Address  |
|Etc...   |
|---------|

如果我有一个Employee表,那么这将是一个用户,因此拥有User表中的所有属性,但也可能有额外的列,例如employee_idPayroll_number,{{1 }},Department_idStart_date等...

客户还拥有所有用户属性,但还需要End_datecustomer_id等...

我想过很多方法可以做到这一点:

  1. 我的第一个想法是只复制每个表中的列,以便员工和客户拥有用户拥有的所有属性。但是,我不认为这是一个非常好的方法,因为它意味着复制每个表的字段,并且在尝试针对多个表对用户进行身份验证时也可能会出现一些问题。

  2. 我的第二种方法是将所有用户保留在一个表中,并使用名为card_number的额外属性,该属性与userTraits表具有多对多关系,该表将充当键=>价值(即rolestrait_idtrait_name)。但是,我担心数据库级别没有任何限制来阻止用户拥有不属于该类型用户的特征(即,客户被分配了trait_value

  3. 我的第三种方法是让所有用户都在同一个表中,但是将所有字段添加到所有用户并使大多数用户无法使用,但是,这与我的第二个问题相同方法,并不会非常有效。

  4. 我的第四种方法是尝试使用Laravels多态关系,但这似乎让我与我想要达到的目标相反。就我对此的理解而言,当你试图拥有相同类型数据的多个版本时,似乎会使用这个,所以给出Laravel文档的例子,有一个payroll_id和{ {1}}通过提供id,likeable_id和likeable_type来共享post like表。但是,如果这两种类型的comment like具有额外的属性,那么这将无效。

  5. 不幸的是,我似乎无法找到解决这个问题的设计模式,并且想知道哪种方式最适合它呢?在实际的PHP实现中,我只有一个User的基类,它有Employee,Customer的子类,允许它们继承User的所有功能,但我似乎无法找到实现这种关系的方法。数据库级别。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我会在User表中添加一个自动增量ID,并在Customer和Employee表中添加对User表的引用。

User table Id ...

Customer table UserId ...

Employee table UserId ....

SELECT * FROM Customer JOIN User ON User.Id=Customer.UserId

客户特定字段将存在于Customer表中,而Employee特定项目将存在于Employee表中。

通过ID字段的连接,您可以获得完整的元素集。

乔尔