Sql server 共享一个;“身份”;隔着桌子

Sql server 共享一个;“身份”;隔着桌子,sql-server,database-design,Sql Server,Database Design,我正在处理一个数据库,它有一个每个用户类型都派生自的现有个人表。换句话说,有如下表格: 个人:名字、姓氏、电子邮件, 员工:个人ID 客户:个人ID 等等 现在,我想添加一个新类型的用户(古怪的人),它不是从单个用户派生的。(WeirdPerson与它相关的数据比任何个人都少得多,我真的不想为一个WeirdPerson将Individual中的每个字段都设置为null。) 我需要在一个表上使用一个键字段,该表将包含来自怪人的条目和来自个人的条目。这建议像这样映射表: MashedupIndivi

我正在处理一个数据库,它有一个每个用户类型都派生自的现有个人表。换句话说,有如下表格:
个人:名字、姓氏、电子邮件,

员工:个人ID
客户:个人ID
等等

现在,我想添加一个新类型的用户(古怪的人),它不是从单个用户派生的。(WeirdPerson与它相关的数据比任何个人都少得多,我真的不想为一个WeirdPerson将Individual中的每个字段都设置为null。)

我需要在一个表上使用一个键字段,该表将包含来自怪人的条目和来自个人的条目。这建议像这样映射表:
MashedupIndividuals:MashedupId,IndividualId
MashedupWeirdPerson:MashedupId,怪人

我希望MashedupId是一个自动生成的字段。因为我使用的是TSQL,所以标识似乎是一个不错的选择。除了MashedupId被分成两个表之外。我又考虑了另一张桌子:
MashedupId:MashedupId

将MashedupId设置为标识,然后在MashedupIndividuals和MashedupWeirdPerson中将其设置为外键

这是前进的最佳方式吗?你将如何解决这个问题


编辑:澄清一下,对于一个古怪的人,我只有一个电子邮件地址。我考虑将email字段从personal中删除,然后用GlobalPersonId和email创建一个新的GlobalPerson表。GlobalPerson表(或我使用的更好的名称)不像将怪人分离为完全不同的类型那样自然。然而。。。我愿意重新考虑这个位置。

您可以有一个包含三个字段的表,其中一个字段始终为空:

马塞杜皮德,个体,怪人


或者使用ID字段和ID类型(单个/怪异)

您可以拥有一个包含三个字段的表,其中一个字段始终为空:

马塞杜皮德,个体,怪人


或者使用ID字段和ID类型(单个/怪异)

您可以为您的ID使用
uniqueidentifier
字段。这保证在多个表中是唯一的。使用该函数生成新值。

您可以为id使用一个
uniqueidentifier
字段。这保证在多个表中是唯一的。使用该函数生成新值。

我建议使用一个表来承载应用程序中所有人共有的数据。然后,您可以为特定类型的人创建其他表,并将它们链接回您的公共表

特伯森

  • 人格(pk)
  • 姓名、地址、生日等
受雇人

  • 雇员ID(pk)
  • PersonID(fk至tblPerson)
  • 职位、电话、电子邮件等
TBL客户

  • 客户ID(主键)
  • PersonID(fk至tblPerson)
  • 其他领域
编辑:

这里有一些更适用于你的问题的定义(和这些奇怪的人在一起也更有趣)。关键是建立古怪人和普通人共享的数据,然后建立支持该模型的表/关系。可能有必要将不适用于怪人的字段从tblIndividual移到tblNormalPerson

双盲

  • 个体ID(pk)
  • 适用于怪异/正常人的其他数据字段
tblWeirdPerson

  • 怪人(pk)
  • 个人ID(fk到TBL)
  • NumberOfHeads(适用于古怪的人)
tblNormalPerson

  • 正常人格(pk)
  • 个人ID(fk到TBL)
  • 名字(其他适用于普通人的字段)
  • 姓氏
  • 等等

我建议使用一个表来承载应用程序中所有人共有的数据。然后,您可以为特定类型的人创建其他表,并将它们链接回您的公共表

特伯森

  • 人格(pk)
  • 姓名、地址、生日等
受雇人

  • 雇员ID(pk)
  • PersonID(fk至tblPerson)
  • 职位、电话、电子邮件等
TBL客户

  • 客户ID(主键)
  • PersonID(fk至tblPerson)
  • 其他领域
编辑:

这里有一些更适用于你的问题的定义(和这些奇怪的人在一起也更有趣)。关键是建立古怪人和普通人共享的数据,然后建立支持该模型的表/关系。可能有必要将不适用于怪人的字段从tblIndividual移到tblNormalPerson

双盲

  • 个体ID(pk)
  • 适用于怪异/正常人的其他数据字段
tblWeirdPerson

  • 怪人(pk)
  • 个人ID(fk到TBL)
  • NumberOfHeads(适用于古怪的人)
tblNormalPerson

  • 正常人格(pk)
  • 个人ID(fk到TBL)
  • 名字(其他适用于普通人的字段)
  • 姓氏
  • 等等

是的,我也考虑过。但总的来说,我不喜欢这样的解决方案。查询一个人是什么类型的人比较困难,而且每一行中的NULL都会让我恼火。你可以有一个“高于”个人(共享)的表格,其中只包含一个sharedID和电子邮件(将电子邮件字段移出个人)。然后你的mashup表就有mashedupID和sharedID。是的,我也考虑过。但总的来说,我不喜欢这样的解决方案。查询一个人是什么类型的人比较困难,而且每一行中的NULL都会让我恼火。你可以有一个“高于”个人(共享)的表格,其中只包含一个sharedID和电子邮件(将电子邮件字段移出个人)。然后你的mashup表就有了mashedupID和sharedID。实际上,数据库已经有了