1

我有一个域模型,其中每个行项目都与一个产品相关联。该产品有一个选项列表。每个选项都是必需的或可选的。用户可以包含一个可选选项,将其添加到行项目的选择列表中。

为了避免冗余,我的第一个想法是从行项目的选择列表中排除所需的选项。有很多必需的选项,因此将它们包含在每个行项目中会导致数据库膨胀。

问题是产品可能会随着时间的推移而发生变化。曾经需要的选项可能会变成可选的,反之亦然。并且可以将全新的选项添加到产品中。这对我最初的想法造成了问题,因为订单项的选择列表的含义将取决于订购时产品的选项。

所以我该怎么做?

  1. 如果我还在行项目的选择列表中包含必需的选项,那么模型很简单。我有一个产品包含的选项的快照。但是我在数据库中也有很多膨胀,因为每个行项目都会重复对所需选项的引用。这是我应该担心的事情,还是 SQL Server 会进行某种幕后压缩?

  2. 我是否应该继续我最初的想法,即从订单项的选择列表中排除所需选项?然后我需要保留一些有关产品更改的历史数据。这样我就可以重新创建订单时存在的产品及其选项。听起来可能,但比第一个选项更复杂。我担心这会花费更多的 CPU 周期,但如果它用于不会经常打开的旧订单,那将没关系。我以前从来没有自己这样做过,但也许不会那么难。如果这是您推荐的方法,请提供一些设计模式等的指针,以帮助我开始。

4

1 回答 1

1

如果您的所需选项列表将来有可能发生变化,我会选择第一个选项。如果您没有将这些选项与数据库中的每个行项目一起存储,那么您必须跟踪哪些选项在哪些日期需要,并单独加入它们。这将不必要地使您的连接逻辑复杂化。

至于使您的数据库膨胀,我认为这不会像您想象的那么糟糕。听起来您可能已经有了连接表,ProductOptions并且LineItemOptions只包含产品密钥和选项密钥。后一个表应该是唯一一个根据您的第一个设计选择最终拥有更多记录的表。由于它只包含键,它的记录不会占用更多的内存,而且加入它会非常快。

于 2012-08-25T16:42:07.880 回答