实施闭环外键约束的完整性约束

时间:2013-03-07 19:54:53

标签: hibernate database-design hsqldb referential-integrity data-integrity

问题来自以下三个表 -

Tour
 - Id

TourPackage
 - Id
 - TourId

Traveller
 - Id
 - TourId
 - PackageId

外键约束已到位。但是,我还希望强制执行旅行者套餐也必须参考旅行者所指的同一个旅行。

Traveller.Tour = Traveller.Package.Tour

我可以在业务层轻松实施此功能,但我可以在数据库中执行此操作吗?或者我应该重新考虑我的设计?请注意,我不打算在新的关系表中提取外键。我认为Tour和Package是Traveler实体的一部分,因此应该驻留在实体本身。

更新

我的应用程序在单个Tour的上下文中运行。因此,我加载的所有数据都将指向单个游览。此外,大多数数据来自Traveler表。因此,有一个直接的TourId到桌面是有道理的。 无论如何,我以这种方式看待这些关系。

  • 巡演有几个包。
  • 一位旅行者自愿参加巡演。
  • 旅行者为订阅的旅游选择包裹。

所以,我猜一个旅行者指的是游览和包裹是明智的。我错了吗?

2 个答案:

答案 0 :(得分:3)

首先,可以使用外键来强制Traveler表中的TourIdPackageId引用保持一致。 FORIEGN KEY TRAVLELLER(TOURID, PACKAGEID) REFERENCES PACKAGE(TROURID, ID)以及TourPackage表上的UNIQUE(TOURID,ID)。

关于您的数据模型,如果巡视有多个包且旅行者为单个包登记,则不需要在Traveler表中使用TourId字段。您可以通过加入三个表来找到TourId。

但是如果旅行者被允许在旅行中登记多个包裹,那么你需要一个关系表来将旅行者与多个包裹联系起来。

答案 1 :(得分:1)

enter image description here

或者,取决于您如何定义“包”。

enter image description here