我试图了解构建关系数据库表的最佳方法,该表具有许多共享列,但也有一些额外的列。 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 表具有多对多关系,该表的作用类似于 key = > 值(即trait_id
、trait_name
、trait_value
)。但是,我担心数据库级别没有任何限制来防止用户具有不应属于该类型用户的特征(即为客户分配payroll_id
)我的第三种方法是让所有用户都在同一个表中,但将所有字段添加到所有用户,并使大多数字段可为空,但是,这与我的第二种方法有相同的问题方法,效率不会很高。
我的第四种方法是尝试使用 Laravel 多态关系,但这似乎与我想要实现的目标相反。据我对此的理解,当您尝试拥有同一类型数据的多个版本时,似乎会使用此方法,因此给出 Laravel 文档的示例,具有
post
和comment like
通过提供 id、likeable_id 和 likeable_type 共享一个likes
表。但是,如果这两种类型的点赞
具有额外的属性,那么这将不起作用。
不幸的是,我似乎找不到解决这个问题的设计模式,并且想知道哪种方法最好?在实际的PHP实现中,我只是有一个User的基类,它有Employee、Customer的子类,允许它们继承User的所有功能,但我似乎找不到一种方法来实现这种关系数据库级别。
任何帮助将不胜感激。
最佳答案
我将向用户表添加自动增量 ID,并在客户表和员工表中添加对用户表的引用。
<p>User table
Id
...</p>
<p>Customer
table
UserId
...</p>
<p>Employee
table
UserId
....</p>
SELECT * FROM Customer JOIN User ON User.Id=Customer.UserId
客户特定字段将驻留在客户表中,员工特定项目将驻留在员工表中。
通过 ID 字段的连接,您可以获得完整的元素集。
乔尔
关于Mysql共享列减少重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37631053/