数据模型,很多,很多,有很多关系

时间:2010-10-21 02:37:55

标签: database database-design many-to-many data-modeling one-to-many

我有两种类型的帐户(客户和提供商),我选择了单表策略来实现持久性。客户以拍卖方式创建订单(one2many)和提供商对订单的出价(many2many关系,因为他可以对许多订单以及其他提供商出价)。我的问题是,是否有可能同时建立这些关系?因为逻辑上它可以工作。但MDA代码生成器不喜欢它。如果是这样,我可能会遇到这个数据模型的缺点。

提前致谢。

alt text

2 个答案:

答案 0 :(得分:1)

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

你遇到麻烦的事实清楚地表明你最有可能以错误的方式做到这一点 - 这对IT行业的大多数事情都是如此(可能是生活本身,但你不需要我改变它这一点)。

我会将它们分成不同的表来解决这个特殊问题。

如果您真的想要共享部分数据,可以将常用内容放在另一个表中,并从客户和提供者表中引用它。

如果单个实体既可以是客户又可以是提供者,则可能需要这样做 - 在这种情况下,您希望两个不同的表条目共享相同的信息(例如余额,信誉等)。

答案 1 :(得分:1)

缺点是您无法在帐户表中的accountID和出价表中的accountID之间强制实施数据库中的参照完整性(我假设它代表提供商的帐户ID 出价因为并非所有的accountID值都是允许的。

但是,不要放弃帐户的单表解决方案,这可能是您的问题的正确解决方案(我不能肯定不完全理解提供商和客户之间的关系)。以下是两者使用单表解决方案并允许参照完整性所需要做的事情:

  1. 从帐户中移除isProvider和isCustomer。

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

  3. 将来自Providers或Customers独有的Accounts的任何其他列迁移到相应的表中。

  4. 现在,Orders表中的accountID应该是Customers的外键,而不是Accounts。同样,Bids中的accountID列成为Providers而不是Accounts的外键。

  5. 提供了帐户的关系完整性和单表存储。