数据库设计 - 如何从不同的表发布2个主键

时间:2010-11-23 18:36:44

标签: database-design

感谢阅读。

我正在为一家小狗店制作数据库。我有一张小狗桌和一张个人所有者和公司所有者(公司拥有小狗)的桌子。小狗可以拥有一个主人,拥有者可以拥有一只以上的小狗。处理这种情况的好方法是什么?

  1. 我是否在小狗桌上使用2个FK,如果小狗是由个人所有者拥有,或者小狗是由公司拥有,则其中一个为空。
  2. 你可以在正常形式的boyce-codd中使用null外键吗?
  3. 非常感谢

6 个答案:

答案 0 :(得分:1)

做这样的事情:

Puppies
PuppyID
PuppyName
PuppyType
...

Owners
OwnerID
OwnerName
OwnerType   'I'=individual, 'C'=corporate 
....

PuppyOwners
OwnerID
PuppyID

答案 1 :(得分:1)

请查看Party Data Model作为您情况的模板。

  

你可以使用null外键吗?   boyce-codd正常形式

没有。 3NF,BCNF,5NF等都专门处理关系没有空值。既然如此,通过简单地忽略零点的可能性来对正规形式进行一些近似或假设是一种常见的做法(虽然非常值得怀疑)。

SQL中可为空的外键会导致许多问题和复杂性。最好再分解表而不是使外键可以为空。

答案 2 :(得分:0)

您的架构不明确。是这个......

Tables:
Puppies
Individuals
Corporations

或者这......

Tables:
Puppies
Owners

我建议第二种情况是更好的设计,允许您指定Owner.Type,而不是为每种类型的所有者提供单独的表。

答案 3 :(得分:0)

创建一个表所有者并使用所有者的PK作为FK的小狗 创建2个表 Individual_Owner Corporate_Owner ,并使用所有者的PK作为PK以及FK到这两个

这是为了澄清对于不同类型的所有者,您将使用PK列,它是映射条目[FK]到所有者表

将任何类型所有者的常用元素放置在所有者

答案 4 :(得分:0)

您需要考虑通过规范化实现的目标。不要为了它而正常化。如果你使你的fk可以为空,那么db将无法帮助你保持数据的一致性 认为:

  • 如果两个fk都为空怎么办? (没有所有者?)
  • 如果两个fk都有价值怎么办? (两位业主?)

另一方面,@ Puspendu建议的解决方案即使你没有可空的外键也有同样的问题。实际上,它使案例更加复杂,因为它允许多个所有者并且使用起来更复杂。

因此,我会选择您建议的模型,它很简单,可以完成工作,并且很容易被其他程序员理解。

答案 5 :(得分:0)

个人所有者和企业主是gen-spec设计模式的经典案例。

搜索“泛化专业化关系建模”。您将看到一些有关如何设置三个表的文章。一个是业主,一个是个人业主,一个是企业主。这三个都使用相同的密钥。专用表中的PK兼作FK,引用所有者表中的相应行。

如果您习惯于对象建模,那么您很熟悉gen-spec模式。它由继承处理。乍一看,关系建模处理相同模式的方式可能看起来很愚蠢。但它确实很好。

最后一个问题是,你是否希望小狗和主人之间的关系是多对一或多对多的。在多对多的情况下。你需要一个单独的桌子来保持小狗 - 主人的关系。否则,您可以在小狗表中放置一个ownerID FK,将一只或多只幼犬链接到一个主人。