Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有外键或字符串时的数据库设计_Sql_Database_Database Design_Foreign Keys_Relational Database - Fatal编程技术网

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

Sql 具有外键或字符串时的数据库设计,sql,database,database-design,foreign-keys,relational-database,Sql,Database,Database Design,Foreign Keys,Relational Database,在我的应用程序中,我创建了一个有主管的案例,但是主管可以是员工也可以是外部主管,因此我希望能够为内部引用保存员工id,或者为外部主管名称保存字符串 我应该如何实现这一点?有一个表“case”和子表“case\u internal\u sv”和“case\u external\u sv”是一种方法吗?如果您的数据库允许您定义多个主键,您可以让field employee和field employee\u type组合起来形成唯一的主键。如果没有,您可以为表自动生成一个主键,并为employee t

在我的应用程序中,我创建了一个有主管的案例,但是主管可以是员工也可以是外部主管,因此我希望能够为内部引用保存员工id,或者为外部主管名称保存字符串


我应该如何实现这一点?有一个表“case”和子表“case\u internal\u sv”和“case\u external\u sv”是一种方法吗?

如果您的数据库允许您定义多个主键,您可以让field employee和field employee\u type组合起来形成唯一的主键。如果没有,您可以为表自动生成一个主键,并为employee type和employee_id创建一个字段


您使用的是什么数据库?

将表规范化可能弊大于利。您应该根据自己的需求评估使用子表的优点/缺点

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

  • 'internal\u sv\u id'
    ,员工表的可空外键
  • 'external\u sv\u name'
    ,用于保存外部名称的可为空字符串
然后根据
“sv\U类型”

这种设计可能不完全符合第三范式,但它可以节省大量昂贵的联接,并允许与employee表保持完整性


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

你的问题中没有太多的信息可以作为答案的基础

如果所有类型的管理器都有公共数据和功能,那么您可能需要一个表来保存这些公共数据。该表将为主管建立主键值,案例表将在此表中包含外键。内部或外部主管所独有的信息将放入单独的表中,这些表还将有一个外键返回到通用主管级数据

这种设计更优越,因为您只有一个地方可以找到所有主管的列表,并且您可以直接在数据库中强制执行主管/案例关系,而无需大量代码或附加约束,以确保填充两列中的“一列且仅一列”


从数据库的角度来看,它是足够优越的,即使内部和外部监督员的数据完全不相交(我不太可能是这样),我也会考虑使用这个设计。

我用PiggRESQL这就是我的想法。我正在考虑按照您的描述将这两个字段设置为空。然后可能会创建一个约束来要求填充其中任何一个。这种设计并不简单,而且很难确保完整性——不能简单地使用主键和外键,需要额外的代码来约束两列中的值。考虑到世界上不可能有那么多监管者,特别是当考虑到构建用户界面和在潜在的多个客户机之间强制执行完整性的额外成本时。外部主管和内部主管是主管的专门子类吗?