通过去规范化去除多多关系是一个好主意

时间:2013-07-14 10:44:57

标签: sql-server database-design many-to-many denormalization

我有一条消息和一份合同,消息与许多合同一起发送,合同可以属于多条消息。这不是一个多方面的直接关系。

  • 合同正在具有状态。我应该跟踪每条消息的合同状态。合同开始日期和结束日期也可以根据业务逻辑进行更改,每条消息都应该包含这些值的版本。​​

  • 合约方仅依赖于ContractID,每条消息不会更改。

因此我制作了这样的ERD: -

合同

  • ContractID
  • FirstParty
  • 第二方
  • ApprovalDate

消息

  • 的MessageID
  • MessageDate

MessageContract

  • ContractID
  • 的MessageID
  • ContractStatus
  • ContractStartDate
  • ContractEndDate

多对多关系需要更复杂的逻辑。我可以将Contract列移动到MessageContract并删除Contract表吗?反规范化原则允许我这样做吗?

合同表仅用于保存这三列,它与除MessageContract之外的其他表没有关系,它需要我在将它放入MessageContract之前选择合同,我会做很多因为我有每天20000封邮件。我需要每个处理器周期才能获得良好的吞吐量。我只是担心合同与新表有新关系的情况下的可扩展性。我看不出放置新表的理由,但如果系统是实时的,我只需要添加一个新表。我的意思是这个案子的好习惯是什么。

1 个答案:

答案 0 :(得分:1)

每天有20k消息,我认为您的笔记本电脑可以承受这个工作量。在这个要求低的政权中,不要过分担心表现。

保持数据规范化有许多好处,包括更快的写入和更少的错误风险。

  

合同开始和结束日期也可以根据业务进行更改   逻辑

内联合同表会强制您在许多地方更新这些日期。这是更开发的工作,更慢,更容易出错。这是规范化的主要论据。

  

我只担心合同有一个案例的可扩展性   与新表的新关系。

在合同中添加新关系将使标准化方法更具吸引力。您不希望将合同数据内联到多个其他表中。

非规范化也是一种有效的技术,但我不认为它适用于您的情况。

我建议您从标准化数据模型开始,将其编入索引并进行快速性能测试。你可能会发现一切都很好。