Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 冗余参考与历史数据_Oop_Design Patterns_Architecture_Relational Database - Fatal编程技术网

Oop 冗余参考与历史数据

Oop 冗余参考与历史数据,oop,design-patterns,architecture,relational-database,Oop,Design Patterns,Architecture,Relational Database,我有一个域模型,其中每个行项目都与一个产品关联。该产品有一个选项列表。每个选项都是必需的或可选的。用户可以包括一个可选选项,将其添加到行项目的选择列表中 为了避免冗余,我的第一个想法是从行项目的选择列表中排除必需的选项。有很多必需的选项,因此将它们包含在每个行项目中会导致数据库膨胀 问题是这些产品可能会随着时间的推移而改变。曾经需要的选项可以变成可选选项,反之亦然。产品中可能会添加全新的选项。这给我最初的想法带来了一个问题,因为行项目选择列表的含义将取决于订购时产品的选项 那我该怎么办 如果我还

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

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

问题是这些产品可能会随着时间的推移而改变。曾经需要的选项可以变成可选选项,反之亦然。产品中可能会添加全新的选项。这给我最初的想法带来了一个问题,因为行项目选择列表的含义将取决于订购时产品的选项

那我该怎么办

  • 如果我还在行项目的选择列表中包含必需的选项,那么模型就很简单。我会有一个产品附带选项的快照。但是我在数据库中也有很多膨胀,因为对必需选项的引用将在每一行项目中重复。这是我应该担心的还是SQL Server会做一些幕后压缩

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


  • 如果你的要求选项列表将来有可能发生变化,我会选择第一个选项。如果不将这些选项与数据库中的每个行项目一起存储,则必须跟踪在哪些日期需要哪些选项,并将它们分别连接起来。这将不必要地使连接逻辑复杂化


    至于数据库膨胀,我不认为这会像你想象的那样糟糕。听起来您可能已经有了只包含产品键和选项键的
    ProductOptions
    lineitempoptions
    的联接表。根据您的第一个设计选择,后一个表应该是唯一具有更多记录的表。因为它只包含键,所以它的记录不会占用更多的内存,而且加入它会非常快。

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

    至于数据库膨胀,我不认为这会像你想象的那样糟糕。听起来您可能已经有了只包含产品键和选项键的
    ProductOptions
    lineitempoptions
    的联接表。根据您的第一个设计选择,后一个表应该是唯一具有更多记录的表。因为它只包含键,所以它的记录不会占用更多的内存,而且加入它会非常快