Sql 什么';关联两个或多个关系表的最佳实践是什么?

Sql 什么';关联两个或多个关系表的最佳实践是什么?,sql,database,database-design,Sql,Database,Database Design,我有一个trip(primary:idTrip),在那里我可以链接更多的包(primary:idPackage),因此,我得到了一个关系表来链接trip与包(primary:idRelTripPackage)。(n对n的关系) 接下来我得到了一个注册表(主:idRegistration)。我如何最好地将这些联系起来(一对一关系) 我在registrations表中添加了两列(idTrip、idPackage) 我添加一个关系表,在其中链接idRegistration、idTrip、idPacka

我有一个trip(primary:idTrip),在那里我可以链接更多的包(primary:idPackage),因此,我得到了一个关系表来链接trip与包(primary:idRelTripPackage)。(n对n的关系)

接下来我得到了一个注册表(主:idRegistration)。我如何最好地将这些联系起来(一对一关系)

  • 我在registrations表中添加了两列(idTrip、idPackage)
  • 我添加一个关系表,在其中链接idRegistration、idTrip、idPackage
  • 我添加一个关系表,在其中链接idRegistration、iDEltripPackage

  • 我认为注册与软件包之间的关系是对的,而且肯定是一对一的关系。有两种选择:

    1:由于它实际上是一对一的,因此没有任何东西可以阻止您将注册数据直接放到RelTripPackage上,或者将idPackage和idTrip作为FKs直接放到注册上,并在两个FK列之间使用唯一键以确保没有重复项

    2:如果您想要两个单独的表,那么只需将idRetTripPackage作为FK添加到注册中,然后在其上添加唯一约束-同样,以确保唯一性


    不需要单独的关系表,因为它是1-1关系-它们只有在使用n-n时才真正相关。剩下的时间FKs应该直接放在子表上。

    我认为注册与RelTripPackage之间的关系是正确的,而且肯定是一对一的关系。有两种选择:

    1:由于它实际上是一对一的,因此没有任何东西可以阻止您将注册数据直接放到RelTripPackage上,或者将idPackage和idTrip作为FKs直接放到注册上,并在两个FK列之间使用唯一键以确保没有重复项

    2:如果您想要两个单独的表,那么只需将idRetTripPackage作为FK添加到注册中,然后在其上添加唯一约束-同样,以确保唯一性


    不需要单独的关系表,因为它是1-1关系-它们只有在使用n-n时才真正相关。其余时间FK应直接放置在子表上。

    如果遵循该逻辑,您将

    • 每次需要添加关系时,都要添加表和关系
    • 最终导致混淆或重复关系(任意两个表之间的多条路径)
    然而,问题(限制因素)是,您开始使用的表实际上没有正常化。由于起始位置没有很好的基础,因此最终将得到比实体之间实际存在的关系多得多的关系(在表中)。因此,最好的建议是,最好的做法是,在尝试当前扩展之前,请后退一步并对现有表中的数据进行正常化。这样扩展就会容易得多,最终会得到更少的表

    • 如果您提供表格信息(人员、行程、包裹等);什么是注册,等等。。。我可以提供更明确的答案
    通常,任何具有实体PK的1::1属性都应该是该实体中的属性。任何具有实体主键的1::0-1属性都应位于单独的表中

    ER图 根据提供的信息,这是您的。只要使用关系标识符,到目前为止所标识的所有关系都将受到直接支持(否则,如果使用ID,则需要更多的关系和表)


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

    如果您遵循该逻辑,您将

    • 每次需要添加关系时,都要添加表和关系
    • 最终导致混淆或重复关系(任意两个表之间的多条路径)
    然而,问题(限制因素)是,您开始使用的表实际上没有正常化。由于起始位置没有很好的基础,因此最终将得到比实体之间实际存在的关系多得多的关系(在表中)。因此,最好的建议是,最好的做法是,在尝试当前扩展之前,请后退一步并对现有表中的数据进行正常化。这样扩展就会容易得多,最终会得到更少的表

    • 如果您提供表格信息(人员、行程、包裹等);什么是注册,等等。。。我可以提供更明确的答案
    通常,任何具有实体PK的1::1属性都应该是该实体中的属性。任何具有实体主键的1::0-1属性都应位于单独的表中

    ER图 根据提供的信息,这是您的。只要使用关系标识符,到目前为止所标识的所有关系都将受到直接支持(否则,如果使用ID,则需要更多的关系和表)


    不熟悉关系数据库建模标准的读者可能会发现这一点很有用。

    好的,注册是旅行者通过选择一个包裹(由他付费)来参加旅行的注册(订单)。@Bogdan。好啊旅行和包裹的区别是什么?套餐是一组旅行还是旅行+机票+酒店?或者,旅行是一次完整的旅行,并按照他们支付的价格(基于质量)打包?等等@Bogdan。所以登记不是“旅行者”,而是不止一个人。。。但是只有一个包裹?如果属于登记的一组旅客中有一人想要不同的包裹,他们必须单独登记?我不明白Trip::Package是怎样的n::m,也不明白为什么需要一个“relation”表来关联它们。@Bogdan。1) 对不起,但我并不困惑。。。我只是解释你提供的信息,这不是很清楚。你越清楚,我就能更好地为你服务