具有外键或字符串时的数据库设计

时间:2017-02-04 17:01:38

标签: sql database database-design foreign-keys relational-database

在我的应用程序中,我正在创建一个具有主管的案例,但由于主管可以是员工或外部主管,我希望能够保存内部引用的员工ID或字符串作为外部监督员姓名的名称。

我该如何实现?有一个表“case”和子表“case_internal_sv”和“case_external_sv”的方式去吗?

3 个答案:

答案 0 :(得分:0)

如果您的数据库允许您定义多个主键,则可以将字段employee和字段employee_type组合以形成唯一主键。如果没有,您可以为表创建一个自动生成的主键,并为employee_id提供一个字段,为employee_id设置一个字段。

您使用的数据库是什么?

答案 1 :(得分:0)

让表格过于规范化可能会带来更大的伤害而不是帮助。您应该根据您的要求评估子表的优缺点。

一个简单的解决方案是在'sv_type'表中添加'case'列。并有两列

  • 'internal_sv_id',员工表的可以为空的外键
  • 'external_sv_name',一个可以保存外部名称的可空字符串。

然后根据'sv_type'

检查这两列中的一个主管

此设计可能不完全符合第三范式,但它可以节省大量昂贵的连接,并允许员工表的完整性。

至于我,如果有疑问,我会选择最简单的解决方案。

答案 2 :(得分:0)

您的问题中没有很多信息可以作为答案的基础。

如果所有类型的主管都有共同的数据和功能,那么您可能希望有一个表来保存该公共数据。该表将为主管建立主键值,案例表将在该表中具有外键。内部或外部主管独有的信息将进入单独的表,这些表还将具有返回公共管理员级别数据的外键。

这种设计是优越的,因为您只有一个地方可以找到所有主管的列表,因为您可以直接在数据库中强制执行主管/案例关系,而无需大量代码或其他限制来确保“填充了两列中的一个且只有一个。

从数据库的角度来看,即使内部和外部主管的数据完全不相交(这是不可能的),我也会考虑使用这种设计。