【发布时间】:2016-10-04 12:06:18
【问题描述】:
我试图了解构建具有许多共享列但也有一些额外列的关系数据库表的最佳方法。 Similar to this question on Laracasts
例如,假设我有一个包含以下列的用户表:
|---------|
| User |
|---------|
|Name |
|Email |
|Password |
|DoB |
|Address |
|Etc... |
|---------|
如果我有一个 Employee 表,这将是一个用户,因此具有 User 表中的所有属性,但也可能有额外的列,例如 employee_id、Payroll_number、Department_id、Start_date ,End_date,等等...
客户也将拥有所有用户属性,但还需要 customer_id 和 card_number 等...
我想了很多方法来做到这一点:
我的第一个想法是只复制每个表中的列,以便员工和客户拥有用户应该拥有的所有属性。但是,我认为这不是一个很好的方法,因为这意味着复制每个表的字段,并且在尝试针对多个表对用户进行身份验证时也可能会导致一些问题。
-
我的第二种方法是将所有用户保存在一个表中,并带有一个名为
roles的额外属性,该属性与 userTraits 表具有多对多关系,该表的作用类似于键 => 值(即 @ 987654331@、trait_name、trait_value)。但是,我担心数据库级别没有任何限制可以防止用户具有不应该属于该类型用户的特征(即为客户分配payroll_id) 我的第三种方法是让所有用户都在同一个表中,但将所有字段添加到所有用户并使它们中的大多数可以为空,但是,这与我的第二种方法有相同的问题方法,而且效率不高。
我的第四种方法是尝试使用 Laravel 多态关系,但这似乎与我想要实现的目标相反。据我对此的理解,当您尝试拥有相同类型数据的多个版本时,似乎会使用此方法,因此以 Laravel 文档为例,
post like和comment like共享 @987654337 @table,通过给出一个 id、likeable_id 和 likeable_type。但是,如果这两种likes有额外的属性,那就不行了。
不幸的是,我似乎找不到解决此问题的设计模式,并且想知道哪种方法最好?在实际的 PHP 实现中,我只是有一个 User 的基类,它有 Employee、Customer 的子类,允许它们继承 User 的所有功能,但我似乎找不到实现这种关系的方法数据库级别。
任何帮助将不胜感激。
【问题讨论】:
-
完全标准化
-
搜索重新表和子类型。
标签: mysql database design-patterns database-design laravel-5.2