1

我正在修改一个旧的多租户应用程序,其中购物车功能将多个供应商和多个客户存储在同一个数据库中。一个供应商的一些客户可能是不同供应商的客户。一些供应商实际上可能是另一个供应商的客户。

我目前有一个带有主键的超级类型“party”的表,一个带有主键(references )party_ID的子类型“company”的表和一个带有主键的“vendor”角色的表(references )。我还有一个联结表,“客户端”,其复合主键为and 。company_IDparty_IDvendor_IDcompany_IDvendor_IDparty_ID

我的问题是“订单”表应该如何引用供应商和客户表?我的第一个想法是该表应该有一个复合主键vendor_ID,client_IDorder_ID(order_ID可以是整个表的自动增量或顺序 per vendor_ID + client_ID) 但这似乎有点可疑,因为有三个属性组成了键......

有没有人对这个话题有任何见解?大多数“购物车”只与一个供应商打交道,因此订单表只是client_ID作为外键列出。

谢谢!

4

3 回答 3

3

我的问题是订单表应该如何引用供应商和客户表?我的第一个想法是该表应该有一个复合主键“vendor_ID”、“client_ID”和“order_ID”,但这似乎有点可疑,因为有三个键......

复合主键并不意味着三个键。这意味着一个键由三列组成。

但这不是真正的问题。

订单是会计记录;它不能随时间而改变。除非您已经建立了临时表,否则存储 ID 号是有风险的,我怀疑您是否已经这样做了。如果供应商今天更改名称,其名称将不再与之前订单上的名称匹配。您不能让会计记录发生这种情况。

除非您通过“订单”表示不寻常的东西,否则我希望 Order_id 是它的主键。可能还有其他限制;甚至可能还有其他关键约束来防止仅由 Order_id 不同的重复订单。但我仍然希望 Order_id 成为订单表的主键。

如果供应商和客户是子类型,我希望您存储的任何(高风险)id 编号都引用子类型表中的 id 编号。在您的情况下,您似乎有一个附加表来标识供应商的客户;它包含列 {vendor_id, client_id}。表的外键引用应该是显而易见的。

您的订单表应该有一个指向表的外键引用,而不是一个指向供应商的外键和另一个指向客户的外键。所以在订单表中,foreign key (vendor_id, client_id) references vendor_clients (vendor_id, client_id). 供应商客户表将需要主键约束或 {vendor_id, client_id} 上的唯一约束。

但是除非您使用时态表,否则您不应该为会计这样做。相反,您可能应该同时存储 id 号和文本。

于 2012-09-11T23:12:54.023 回答
0

对于您的主键,您只需要order_id.

实际上,我将使用的复合(和唯一)键是 [ vendor_id, client_id, occurredAt] (其中occurredAt是时间戳) - 假设订单只能每毫秒下一次。然而,这是一个广泛的关键,一些系统不欣赏这些。但是,您仍然需要这些列,并且可能已编入索引。

于 2012-09-11T23:14:23.873 回答
0

我会从这样的事情开始。我承认我仍然不太了解company, vendor, and client您的问题之间的区别。正如猫叫所提到的,在这个模型中你不能删除Parties( People, Organizations);会计记录应该被冻结——通常是通过在订单表中捕获当前的客户/供应商信息。


在此处输入图像描述

于 2012-09-13T13:14:35.690 回答