2009-08-31 56 views
0

我正在处理具有每个用户类型派生自的现有个人表的数据库。换句话说,有喜欢的表:
Individual: FirstName, LastName, Email, <lots more>
员工:IndividualId
客户:IndividualId
跨表共享一个“身份”

现在,我要添加新的用户类型(WeirdPerson)不从派生个人。 (WeirdPerson与其相关的数据明显少于任何个人,而且我真的不希望几乎将个体中的每个字段都设置为WeirdPerson的空值。)

我需要一个关键字段用于表来自WeirdPersons的条目和来自个人的条目。这表明映射表如下所示:
MashedupIndividuals: MashedupId, IndividualId
MashedupWeirdPerson: MashedupId, WeirdPersonId

我想MashedupId是自动生成的场。由于我使用的是TSQL,因此身份似乎是一个不错的选择。除了MashedupId分为两个表格。我考虑过另外一张表:
MashedupIds: MashedupId
设置MashedupId为一个标识,然后在MashedupIndividuals和MashedupWeirdPerson中将其设置为外键。

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

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

+0

我想我从未见过没有名字或姓氏的人。这些奇怪的人究竟是什么? – jmucchiello 2009-08-31 17:16:23

+0

我编辑了我的问题来解决WeirdPerson的奇怪问题。我想我可以逃脱而不给他们更多的信息。我显然是错的。 :) – Eric 2009-08-31 17:28:24

回答

2

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

tblPerson

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

tblEmployee

  • 雇员(PK)
  • 是PersonID(FK到tblPerson)
  • 标题,OfficePhone,电子邮件等

tblCustomer

  • 客户ID(PK)
  • 是PersonID(FK到tblPerson)
  • 其他领域...

编辑:

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

tblIndividual

  • IndividualID(PK)
  • 了适用于这两个怪异/正常人

tblWeirdPerson

  • WeirdPersonID(PK)
  • IndividualID数据的其他领域(fk到tblIndividual)
  • NumberOfHeads(适用于怪异的人)

tblNormalPerson

  • NormalPersonID(PK)
  • IndividualID(FK到tblIndividual)
  • 姓(其它领域适用于正常的人)
  • 姓氏
  • 等等......
+0

实际上,db已经包含这样的设置。问题是WeirdPerson不适合我的个人表。 – Eric 2009-08-31 17:10:17

+1

我认为他的意思是,如果你有一个“不是”一个人的WeirdPerson类,你显然没有基础班级。你可以有tirdlerson,WeirdPerson等从中派生出来,tblDetailPerson,这是“正常”人从中派生出来的。我认为这就是mmayo的目标。 – 2009-08-31 17:13:07

+0

然后,你需要更具体地说明这些人怪异的原因。他们没有名字或地址?或者人脸表格有更多不适用的字段? – jmucchiello 2009-08-31 17:14:53

0

你可以有一个表有三个字段,其中一个总是空:

MashedupId,IndividualId,WeirdPersonId

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

+0

是的,我也这么认为。但总的来说,我不是这种解决方案的粉丝。查询一个人是什么类型很困难,而且每一行中的NULL都会刺激我。 – Eric 2009-08-31 17:07:34

+0

您可以在个人(共享)的“上方”使用共享ID和电子邮件(将电子邮件字段移出个人)。然后你的mashup表只有mashedupID和sharedID。 – Beth 2009-08-31 19:42:27

1

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

+0

+1:只需一次调整:对所有表使用单个SEQUENCE。 – ATorras 2009-08-31 17:11:00