我有一个域模型,其中每个行项目都与一个产品相关联。该产品有一个选项列表。每个选项都是必需的或可选的。用户可以包含一个可选选项,将其添加到行项目的选择列表中。
为了避免冗余,我的第一个想法是从行项目的选择列表中排除所需的选项。有很多必需的选项,因此将它们包含在每个行项目中会导致数据库膨胀。
问题是产品可能会随着时间的推移而发生变化。曾经需要的选项可能会变成可选的,反之亦然。并且可以将全新的选项添加到产品中。这对我最初的想法造成了问题,因为订单项的选择列表的含义将取决于订购时产品的选项。
所以我该怎么做?
如果我还在行项目的选择列表中包含必需的选项,那么模型很简单。我有一个产品包含的选项的快照。但是我在数据库中也有很多膨胀,因为每个行项目都会重复对所需选项的引用。这是我应该担心的事情,还是 SQL Server 会进行某种幕后压缩?
我是否应该继续我最初的想法,即从订单项的选择列表中排除所需选项?然后我需要保留一些有关产品更改的历史数据。这样我就可以重新创建订单时存在的产品及其选项。听起来可能,但比第一个选项更复杂。我担心这会花费更多的 CPU 周期,但如果它用于不会经常打开的旧订单,那将没关系。我以前从来没有自己这样做过,但也许不会那么难。如果这是您推荐的方法,请提供一些设计模式等的指针,以帮助我开始。