1

我有一个 Message 和一个 Contract,Message 是和很多个 contract 一起发送的,一个 Contract 可以属于几个 message。这不是一个直接的多对多关系。

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

  • 合同方仅取决于 ContractID,不会因每条消息而更改。

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

合同

  • 合同编号
  • 第一方
  • 第二方
  • 批准日期

信息

  • 消息ID
  • 消息日期

消息合约

  • 合同编号
  • 消息ID
  • 合同状态
  • 合同开始日期
  • 合同结束日期

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

合同表仅用于保存这三列,它与除 MessageContract 之外的其他表没有关系,它要求我在将其放入 MessageContract 之前选择一个合同,我会经常这样做,因为我有 20,000 条消息每天。我需要每个处理器周期来获得良好的吞吐量。我只是担心合同与新表有新关系的情况下的可伸缩性。我看不出放置新表的理由,但是如果系统处于活动状态并且我只需要添加一个新表怎么办。我的意思是这种情况下的良好做法是什么。

4

1 回答 1

1

每天有 20k 条消息,我认为您的笔记本电脑可以承受这种工作量。在这个要求不高的制度下,不要过分担心性能。

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

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

内联合同表将迫使您在许多地方更新这些日期。那是更多的开发工作,更慢且更可能出现错误。这是规范化的主要论据。

我只是担心合同与新表有新关系的情况下的可伸缩性。

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

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

我建议您从规范化数据模型开始,做好索引并进行快速性能测试。你可能会发现一切都很好。

于 2013-07-14T11:19:31.293 回答