Database 当现有表无法更改时,如何强制执行一对多关系

Database 当现有表无法更改时,如何强制执行一对多关系,database,oracle,database-design,Database,Oracle,Database Design,作为背景,我的情况是我有一个缺少很多外键关系的数据库。特别是一个,我们称之为订单,它用OrderID和LocationID的复合主键表示订单。我们将调用的另一个表OrderDetails,它有OrderID,但没有LocationID。实际上,不可能同时在两个位置拥有订单,因此假设不需要在details表中包含LocationID。这不是我设计的,我不能改变 由于各种原因,我们还必须假设不支持将位置id添加到details表中。我们还与Oracle和一个在多个位置拥有多个并发用户的高容量数据库合

作为背景,我的情况是我有一个缺少很多外键关系的数据库。特别是一个,我们称之为订单,它用OrderID和LocationID的复合主键表示订单。我们将调用的另一个表OrderDetails,它有OrderID,但没有LocationID。实际上,不可能同时在两个位置拥有订单,因此假设不需要在details表中包含LocationID。这不是我设计的,我不能改变

由于各种原因,我们还必须假设不支持将位置id添加到details表中。我们还与Oracle和一个在多个位置拥有多个并发用户的高容量数据库合作。最后,更改使用此表的任何应用程序的时间最短

所以我的问题是:这个解决方案是可行的,还是我应该尝试其他方法

假设我创建了一个交集表,因为缺少更好的名称AllOrders或主键OrderID的任何东西。现在我们将订单.OrderID链接到AllOrders.OrderID,并将订单详细信息.OrderID链接到AllOrders.OrderID。那么,通过每次插入订单时的触发器来填写AllOrders是否合理,以加强完整性?我假设所有的应用程序都在订单后插入详细信息,或者执行的更改是最小的,并且是允许的

有没有更好的解决办法?我知道,如果我们负责设计,或者有更多的空间进行修复,我们会采取不同的做法,但我会尽量利用这些限制

编辑--
为了阐明我希望实现的目标,我希望将具有相同ID的所有订单视为等价类模位置,并确保如果删除任何订单,则需要删除具有相同ID的所有订单以及删除所有子订单详细信息。最重要的是没有孤立的细节。这必须尽可能减少应用程序更改,并且尽可能不重新设计现有表。

创建一个新表以处理后续映射

表:Tb\U订单\U订单详细信息


列:OrderID、LocationID、OrderDetailsID

如果您只是想强制执行外键,为什么不在
Orders
中的
OrderID
上设置唯一约束,并在
OrderDetails
中创建外键约束呢?理想情况下,您希望基于主键定义外键,但允许在任何唯一列上定义它们。因为OrderID不唯一,存在重复项,真正的唯一性是OrderID和LocationID。那么,当您说“不可能同时在两个位置拥有订单”时,这是什么意思?这似乎意味着,
orderID
是唯一的。如果
OrderID
不是唯一的,我不确定您的新表将如何工作。如果使用相同的
OrderID
删除
Order
中两行中的一行,会发生什么情况?为了弄清楚不应该从新表中删除该行,您需要一个相当复杂(且昂贵)的复合触发器,它包含行和语句级部分。这是可能的,但要复杂得多。我们说的是现实,数据库所代表的,一种秩序,不能同时在两个地方作为对象的物理集合。这张桌子设计不正确,就是说。问题是如何最大限度地利用糟糕的情况。我仍然很困惑。实际表是否有多行具有相同的
OrderID
?您想保留那些重复的行,而不是进行一次性清理?您的新表是否有多行具有相同的
OrderID
?或者您是否正在考虑使用一个相当复杂的三步触发器来区分
OrderID
值以创建新表?如果多个会话发生更改怎么办?