0

从以下三个表,问题就出现完整性约束 -强制闭环外键约束

Tour 
- Id 

TourPackage 
- Id 
- TourId 

Traveller 
- Id 
- TourId 
- PackageId 

外键约束到位。不过,我也希望执行该旅行者套餐也必须参考旅行者所提及的相同旅行。

Traveller.Tour = Traveller.Package.Tour 

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

UPDATE

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

  • 一个旅游有几个包。
  • 一位旅行者参加旅行。
  • 旅行者为订购的旅程选择包裹。

所以,我猜旅游者和旅行者之间的关系是合理的。我错了吗?

+0

首先将TourId存储在旅行者中有什么好处? – ryanbwork 2013-03-07 19:58:10

+0

@ryanbwork - 请看看最新的问题。 – 2013-03-07 20:05:42

回答

3

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

关于您的数据模型,如果旅程有几个包并且旅行者只需要一个包,则Traveler表中不需要TourId字段。您可以通过加入三个表格来找到TourId。

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

1

enter image description here

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

enter image description here

+0

不错的图片,但都没有设计反映'Traveller'中的'TourID'是冗余/非规范化的。 – Hazzit 2013-03-09 22:03:49

+0

@Hazzit - 请解释一下? – 2013-03-10 15:55:54

+0

PackageID和TourID具有N:1的关系。旅游有* n *套餐,一个套餐属于1次旅游。虽然旅行者“首先选择一次旅行,然后选择一个包裹”,但存储包裹ID已足够,因为它意味着选择了哪个旅程。你提出的两个Traveller表都存储一个TourID和一个PackageID。这是多余的。这也使得维护系统的完整性变得更加困难 - 人们可以在属于完全不同的TourID的Traveller表中存储一个PackageId。 – Hazzit 2013-03-10 16:03:37