SQL最佳实践:使用列存储两种不同的数据?

时间:2016-02-04 20:49:30

标签: mysql sql database foreign-keys

假设我有一个包含idusernamepasswordtypelinked_id

的登录表

type列指定该登录属于员工还是客户。

如果他们是员工,linked_id是他们在员工表中的ID。

如果他们是客户,linked_id是客户表中的ID。

直观地说,这似乎是一个坏主意,但除了处理外键约束外,我无法思考或不理由。

这也提出了另一个问题:在这样的情况下,FK约束总是很重要吗?

思想?

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是在数据库中添加一个额外的列,并使EmployeeIdClientId更容易理解表格结构。

您还可能认为您在数据库设计中缺少实体。举个例子,如果员工也是客户呢?在这种情况下,现行制度将如何处理?

您可以拥有一个中间表来管理它并确定该人员的状态。

即。有表Login

字段:ID, username, password, type, PersonId

然后使用PersonEmployeeId的另一个表ClientId,虽然我认为这会导致很多NULL值,但它会支持上述情况描述。

作为补充说明,我不想查看现有的Login表,识别linked_id字段,然后必须决定此列与哪个表相关,Employee或{{1} }?

您也可以像@ randyh22建议的那样将其拆分,并完全删除Client字段,并在子表(linked_idLogin中设置Employees个标识符

重构:

登录表:LoginId,用户名,密码(确保经过哈希处理)

员工表:EmployeeId,Forename,Surname,LoginId

客户端表:ClientId,Forename,Surname,LoginId

答案 1 :(得分:2)

我认为你错误地考虑了你的桌面设计。我将登录信息放在一个表中,然后从相应的表中指向登录记录。换句话说,从employee表和clients表指向您的登录记录,而不是从登录记录指向客户或员工记录。这允许您拥有外键约束,并且不需要额外的“type”字段

举个例子:

  • 登录:Id(PK),用户名,密码
  • 员工:Id(PK),姓名,EmployeeNumber,Login_Id(FK_LoginId)
  • 客户:Id(PK),名称,地址,Login_Id(FK_LoginId)

然后,您固有地知道每个登录的“类型”是什么表存储数据。