【问题标题】:Mysql shared columns to reduce repetitionMysql共享列减少重复
【发布时间】:2016-10-04 12:06:18
【问题描述】:

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

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

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

如果我有一个 Employee 表,这将是一个用户,因此具有 User 表中的所有属性,但也可能有额外的列,例如 employee_idPayroll_numberDepartment_idStart_dateEnd_date,等等...

客户也将拥有所有用户属性,但还需要 customer_idcard_number 等...

我想了很多方法来做到这一点:

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

  2. 我的第二种方法是将所有用户保存在一个表中,并带有一个名为 roles 的额外属性,该属性与 userTraits 表具有多对多关系,该表的作用类似于键 => 值(即 @ 987654331@、trait_nametrait_value)。但是,我担心数据库级别没有任何限制可以防止用户具有不应该属于该类型用户的特征(即为客户分配payroll_id

  3. 我的第三种方法是让所有用户都在同一个表中,但将所有字段添加到所有用户并使它们中的大多数可以为空,但是,这与我的第二种方法有相同的问题方法,而且效率不高。

  4. 我的第四种方法是尝试使用 Laravel 多态关系,但这似乎与我想要实现的目标相反。据我对此的理解,当您尝试拥有相同类型数据的多个版本时,似乎会使用此方法,因此以 Laravel 文档为例,post likecomment like 共享 @987654337 @table,通过给出一个 id、likeable_id 和 likeable_type。但是,如果这两种likes 有额外的属性,那就不行了。

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

任何帮助将不胜感激。

【问题讨论】:

  • 完全标准化
  • 搜索重新表和子类型。

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


【解决方案1】:

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

用户表 ID ...

客户 桌子 用户身份 ...

员工 桌子 用户身份 ....

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

客户特定字段将存在于客户表中,而员工特定项将存在于员工表中。

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

乔尔

【讨论】:

  • LEFT 的使用限制在您拥有Customer 可能不是User,但您想为他争取一行的地方。
猜你喜欢
  • 2016-06-08
  • 2021-01-19
  • 1970-01-01
  • 2016-12-20
  • 2013-09-22
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多