Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Database 数据模型,多个有多个关系的多个_Database_Database Design_Many To Many_Data Modeling_One To Many - Fatal编程技术网

Database 数据模型,多个有多个关系的多个

Database 数据模型,多个有多个关系的多个,database,database-design,many-to-many,data-modeling,one-to-many,Database,Database Design,Many To Many,Data Modeling,One To Many,我有两种类型的帐户(客户和提供商),我选择了单表策略进行持久化。客户创建订单(one2many)并以拍卖方式对订单进行提供商竞价(多个关系,因为他可以对多个订单以及其他提供商进行竞价)。我的问题是,有可能同时拥有这些关系吗?因为从逻辑上讲它可以工作。但是MDA代码生成器不喜欢它。如果是的话,这个数据模型会有什么缺点 提前谢谢 “我选择了单表策略来实现持久性”——在我看来,这实际上并不是将它们结合起来的好理由。客户和供应商是根本不同的野兽 你遇到麻烦这一事实清楚地表明,你很可能是在用错误的方式做事

我有两种类型的帐户(客户和提供商),我选择了单表策略进行持久化。客户创建订单(one2many)并以拍卖方式对订单进行提供商竞价(多个关系,因为他可以对多个订单以及其他提供商进行竞价)。我的问题是,有可能同时拥有这些关系吗?因为从逻辑上讲它可以工作。但是MDA代码生成器不喜欢它。如果是的话,这个数据模型会有什么缺点

提前谢谢

“我选择了单表策略来实现持久性”——在我看来,这实际上并不是将它们结合起来的好理由。客户和供应商是根本不同的野兽

你遇到麻烦这一事实清楚地表明,你很可能是在用错误的方式做事——it行业的大多数事情都是如此(可能是生活本身,但你不需要我在这方面进行劝导)

我会把它们分成不同的表格来解决这个问题

如果您真的希望共享部分数据,您可以将公共内容放在另一个表中,并从customers和providers表中引用它


如果一个实体既可以是客户,也可以是提供商,那么您可能希望这两个不同的表项共享相同的信息(例如余额、信誉等).

缺点是,您无法在accounts表中的accountID和bids表中的accountID(我假设它代表供应商在订单上投标的accountID)之间的数据库中强制执行引用完整性,因为并非所有accountID值都是允许的

但是,不要放弃针对客户的单表解决方案,这很可能是解决您问题的正确方法(我不能肯定地说,您没有完全理解提供商和客户之间的关系)。要使用单表解决方案并允许引用完整性,需要执行以下操作:

  • 从帐户中删除iProvider和iCustomer

  • 添加两个新的表提供者和客户。每个表都有一个accountID列,该列既是该表中的主键,也是返回原始account表的外键

  • 将供应商或客户唯一的帐户中的任何其他列迁移到相应的表中

  • 现在,Orders表中的accountID应该是客户的外键,而不是帐户。类似地,Bids中的accountID列成为提供者而不是帐户的外键


  • 为accounts提供了关系完整性和单表存储。

    您需要第四个表——ACCOUNT\u TYPE\u代码和ACCOUNT中的一列作为外键。我不明白你所说的“同时”是什么意思同意-不明白这个模型是如何考虑客户和提供商的。客户和提供商似乎被存储为帐户,iProvider和iCustomer列有所不同。我选择这种单表策略还有其他原因。客户和提供商仅在“声誉”属性上有所不同。唯一的主要区别是客户创建订单。如果我将共享帐户表拆分为客户和提供商的两个表,将会有大量的额外工作。太多的后果。我以前从未见过这种模式,我使用的Liferay代码生成器不接受这种模式。唯一的主要区别是客户创建订单,供应商只对订单进行竞价。但你提出的解决方案似乎是最好的。非常感谢。