在表之间共享“身份”

时间:2009-08-31 16:59:10

标签: sql-server database-design

我正在开发一个数据库,该数据库具有每个用户类型派生自的个人表。换句话说,有如下表:
Individual: FirstName, LastName, Email, <lots more>
Employee: IndividualId
Customer: IndividualId

现在,我想添加不是从个人派生的新类型的用户(WeirdPerson)。 (WeirdPerson与其相关的数据明显少于任何个体,我真的不想将个人中的每个字段设置为对于WeirdPerson为null。)

我需要在一个表上使用一个关键字段,该表将包含来自WeirdPersons的条目和来自Individuals的条目。这表明地图表如下:
    <lots more

我希望MashedupId成为自动生成的字段。由于我使用的是TSQL,因此身份似乎是一个不错的选择。除了MashedupId分为两个表。我考虑了另一张桌子:
    MashedupIndividuals: MashedupId, IndividualId
MashedupWeirdPerson: MashedupId, WeirdPersonId

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

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

编辑:澄清一下,我对WeirdPerson的唯一信息就是电子邮件地址。我考虑从个人中删除电子邮件字段,然后创建一个只有GlobalPersonId和Email的新GlobalPerson表。 GlobalPerson表(或者我使用的任何更好的名称)并不像将WeirdPerson分离为完全不同的类型那样自然。但是......我愿意重新考虑这个立场。

3 个答案:

答案 0 :(得分:2)

我建议使用一个表来托管应用程序中所有人共有的数据。然后,您可以为特定类型的人员添加其他表格,并将其链接回公共表格。

tblPerson

  • PersonID(pk)
  • 姓名,地址,生日等

tblEmployee

  • EmployeeID(pk)
  • PersonID(fk to tblPerson)
  • 标题,OfficePhone,电子邮件等

tblCustomer

  • CustomerID(pk)
  • PersonID(fk to tblPerson)
  • 其他领域......

编辑:

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

tblIndividual

  • 个人ID(pk)
  • 适用于奇怪/普通人的数据的其他字段

tblWeirdPerson

  • WeirdPersonID(pk)
  • 个人ID(fk to tblIndividual)
  • NumberOfHeads(适用于奇怪的人)

tblNormalPerson

  • NormalPersonID(pk)
  • 个人ID(fk to tblIndividual)
  • FirstName(适用于普通人的其他字段)
  • 名字
  • 等等...

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

MashedupId,IndividualId,WeirdPersonId

或ID字段和ID类型(个人/怪异)