Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何对该数据库子类型关系进行建模?_Sql_Database Design_Web Applications_Language Agnostic - Fatal编程技术网

Sql 如何对该数据库子类型关系进行建模?

Sql 如何对该数据库子类型关系进行建模?,sql,database-design,web-applications,language-agnostic,Sql,Database Design,Web Applications,Language Agnostic,我正在修改一个遗留的多租户应用程序,其中购物车功能在同一数据库中存储多个供应商和多个客户端。一个供应商的一些客户可能是另一个供应商的客户。一些供应商实际上可能是另一个供应商的客户 我目前有一个表,用于主键为party\u ID的超级类型“party”,一个表用于主键为company\u ID(参考party\u ID)的子类型“company”,还有一个表用于主键为vendor\u ID(参考company\u ID)的“vendor”角色。我还有一个连接表“client”,其复合主键为vend

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

我目前有一个表,用于主键为
party\u ID
的超级类型“party”,一个表用于主键为
company\u ID
(参考
party\u ID
)的子类型“company”,还有一个表用于主键为
vendor\u ID
(参考
company\u ID
)的“vendor”角色。我还有一个连接表“client”,其复合主键为
vendor\u ID
party\u ID

我的问题是“order”表应该如何引用vendor表和client表?我的第一个想法是,表应该有一个复合主键,
vendor\u ID
client\u ID
order\u ID
order\u ID
可以在表中自动递增,也可以按
vendor\u ID+client\u ID
顺序递增) 但这似乎有点可疑,因为钥匙有三个属性

有人对这个话题有什么见解吗?大多数“购物车”只与单个供应商打交道,因此订单表只是将
客户ID
列为外键

谢谢

我的问题是订单表应该如何引用供应商和 客户表?我的第一个想法是桌子应该有一个 “供应商ID”、“客户ID”和“订单ID”的复合主键,但 这看起来有点可疑,因为有三把钥匙

复合主键并不意味着三个键。它表示由三列组成的一个键

但这不是真正的问题

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

除非你所说的“订单”是指不寻常的东西,否则我希望订单id是它的主键。可能还有其他制约因素;甚至可能还有其他键约束来防止重复的订单,这些订单只因订单id不同而不同。但我仍然希望订单id是订单表的主键

如果供应商和客户是子类型,我希望您存储的任何(高风险)id号都引用子类型表中的id号。在您的案例中,您似乎有一个额外的表,用于标识供应商的客户;它包含列{vendor\u id,client\u id}。该表的外键引用应该是显而易见的

订单表应该有一个外键引用该表,而不是一个外键引用供应商,另一个外键引用客户。因此,在订单表中,
外键(供应商id,客户id)引用供应商客户(供应商id,客户id)
。供应商客户机表将需要对{vendor_id,client_id}的主键约束或唯一约束


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

对于主键,您只需要
订购id


实际上,我将使用的复合(和唯一)键是[
vendor\u id
client\u id
ocurredat
](其中
ocurredat
是时间戳)——假设订单每毫秒只能下一次。然而,这是一个宽泛的关键,有些系统不喜欢这些。您仍然需要这些列,而且可能需要索引。

我将从以下内容开始。我承认,在您的问题中,我仍然不太理解
公司、供应商和客户之间的区别。正如Catcall所提到的,在此模式中,您不允许删除
各方
人员
组织
);应冻结会计记录——通常通过在订单表中捕获当前客户/供应商信息



那么,如果供应商是一方,那么客户也是一方?供应商和客户在字段(列)方面有什么区别?@damir-查看此线程以获取有关party模型的信息-我确实理解party的概念,但不理解您对它的应用。供应商和公司之间的区别是什么?Hi@Damir,我们的应用程序中有许多公司,其中只有一些是供应商,因此有额外的表(供应商旁边还有许多其他角色,如客户、俱乐部、雇主等)。就个人而言,我想我更喜欢临时表,而不是存储文本。嗯,无论如何,在OLAP数据库的非标准化之前。@catcall-谢谢您花时间回复。我理解,出于会计目的,您需要特定订单或交易的不可变时间表示,因此将各种事实存储为文本将是有益的。但是,您是说订单表应该有单独的外键“vendor\u ID”和“client\u ID”,另外还有记录供应商和客户的文本字段吗?@Bendos-我相信他是说,如果
client
vendor
中的任何字段都有可能发生更改(并且与会计行项目相关),它们需要包含在
订单中
。可能除了外键列之外。这就是为什么我更喜欢时态表…@Bendos:你需要存储足够的信息,以便在政府官员、法官或仲裁员要求你复制你的会计文书时能够复制。您可以通过多种方式满足该要求,但一般来说,您需要以某种方式存储文件上出现的任何内容。这可能意味着只存储jpg图像。就我个人而言,我会尝试购买商业广告,不在网上