关联2个或更多关系表的最佳做法是什么?

时间:2011-03-03 21:53:46

标签: sql database database-design

我有一个旅行(主要:idTrip),我可以链接更多的包(主要:idPackage),因此,我有一个关系表来链接旅行包(primary:idRelTripPackage)。 (关系n-to-n)

然后我得到了一个注册表(primary:idRegistration)。我如何最好地链接这些(1对1的关系)?

  1. 我在注册表中添加了两列(idTrip,idPackage)?
  2. 我添加了一个关系表,其中我链接了idRegistration,idTrip,idPackage?
  3. 我添加了一个关系表,其中我链接了idRegistration,idRelTripPackage?

2 个答案:

答案 0 :(得分:3)

我是否正确地认为注册的关系是RelTripPackage,它绝对是一对一的。有几种选择:

1:因为它实际上是一对一的,所以没有什么可以阻止你将注册数据直接放到RelTripPackage上,反之亦然,并且将idPackage和idTrip直接放在注册为FK上,具有独特性键入两个FK列以确保没有重复。

2:如果确实需要两个单独的表,那么只需将idRetTripPackage作为FK添加到注册,然后再添加一个唯一约束 - 再次确保唯一性。

不需要单独的关系表作为它的1-1关系 - 当你使用n-n时它们才真正变得相关。其余的时间FK应该直接放在子表上。

答案 1 :(得分:1)

如果你遵循这个逻辑,你将

  • 每次需要添加关系时添加表和关系
  • 最终导致混乱或重复的关系(任意两个表之间的多条路径)

然而,问题(限制因素)是您开始使用的表实际上没有规范化。由于起始位置没有良好的基础,您最终会得到比实体之间实际存在的更多关系(在表格中)。所以最好的建议是,在您尝试此当前扩展之前,最佳做法是退回并规范化数据,即现有表。然后扩展会更容易,最终会减少表格。

  • 如果您提供信息表(人物,旅行,包裹等);什么是注册等...我可以提供更明确的答案。

通常,具有实体PK的1 :: 1属性应该是该实体中的属性。具有实体PK的1 :: 0-1的任何属性都应该在一个单独的表中。

ER图

根据提供的信息,这是您的▶Entity Relation Diagram◀。只要您使用关系标识符,就可以直接支持您到目前为止识别的所有关系(否则,如果您使用ID,则需要更多关系和表格)。

不熟悉关系数据库建模标准的读者可能会发现▶IDEF1X Notation◀很有用。