是否存在用于管理深层多对多关系的设计模式?


10

我在定义这个数据模式时遇到了麻烦,在多个应用程序上工作时遇到了麻烦。

它包括:

  1. 由许多对象本身组成的对象类型
  2. 第二种对象类型,其中每个实例“具有很多”第一个对象
  3. 并且,每个对象的每个关联都可以将第一对象的每个子对象修改为第二对象类型。

一个简单的示例可能是:

  1. 一门编程课程,包含一组课程
  2. 这些课程由一组作业组成。
  3. 可以将课程分配给学生。
  4. 但是,一旦将课程分配给学生,则可以通过删除和添加为该学生定制每个课程和/或作业,以至于原始课程可能无法识别。

在我的解决方案中,结果是:

将课程分配给学生后,该课程将加载到内存中。然后,对于每个子对象,使用适当的元数据生成学生/子对象关系对象。本质上,我使用原始对象作为模板来生成所需的可自定义对象。

随着子对象变得更加复杂和编号,这将导致大量数据。我想知道是否存在一些优化或模式,以减少处理此数据模式所需的逻辑/复杂度。


2
您确定要“减少数据量”吗?相反,您是在寻找减少为实现所需行为而需要编写的“减少大量平凡的代码和逻辑”的方法?(我注意到对数据的持续管理需要与数据库类似的关系数据结构。)
rwong 2015年

@rwong是的,“减少不平凡的代码和逻辑的数量”是我的最终目标。对我来说,这意味着以某种方式降低数据复杂性,但这并不一定是必需的。它已成为一种常见的数据模式,我想知道是否有一些更简单的方法来管理它。
尼古拉斯·皮克林

1
原则上,这是m:n关系的增强版本。诸如“如何管理复杂对象关系”之类的标题呢?
Thomas Junk

1
大量数据与大量复杂数据不同。管理您构建的内容的难度可能会随着复杂性而不是数量而增加。
Walter Mitty 2015年

1
有趣。我已经在具有这种模式的几个应用程序上工作,但从未发现过它是一种模式。也希望看到更简单的方法来管理此类数据。
2015年

Answers:


6

我根据您的需求看到了一些选择:(1)是否有许多遵循通用算法的独特实例;(2)如果有许多相似的对象,或者您将在运行时生成对象;(3)如果您要在运行时动态修改对象的行为。注意:如果需要,您可以组合我在这里提到的所有模式。

  1. 如果每个“第二种对象类型”都是唯一的,但遵循相似的行为模式,则可以使用Template Pattern。听起来您可能正在这样做。但为了明确起见,您的抽象基类已编程了通用算法;该算法的某些步骤在派生类中实现。

  2. 如果您将创建许多对象,或者如果在运行时创建对象对您很重要,则可以使用Factory Pattern

  3. 而且,如果您希望动态更改行为,则可以使用Stategy模式。例如,如果确定常规课程中的学生有特殊需要或进入速成课程。通过组合表示课程基础类的对象的“学生”来工作。该课程将在学生建造时分配给派生课程(听起来很奇怪),以后可以重新分配给另一个派生课程。

(仅供参考,如果在C ++中使用(3)策略模式,则必须使用Rvalues进行合成。)

要存储您的对象和第二个对象,可能值得考虑使用迭代器模式(在它们之间循环,添加,删除,排序等)。

一个很好的参考是Head First Design Patterns,它涵盖了我提到的模式及其实现。他们使用Java工作。


0

我发现很难相信,在存在数据存储或持久性的情况下,您需要在运行时的任何给定时间点具有这种深度的对象。这是CRUD GUI的吗?如果是这样,那么我建议从一开始就改变您的方法。IE浏览器:

确定学生显示所需的子结构,并有状态地将其原始索引存储回db,并在视图和后端db之间进行无状态更新。


我不确定我是否理解您的建议。我应该生成一个空的子对象,然后强制用户使用另一种形式,允许他们修改子对象?
Nicholas Pickering

我建议,如果您要做的只是对象内容与后端数据库之间的无状态事务,则对象本身并不能完成很多工作。如果是这种情况,请删除它们,然后仅对面对客户的数据进行事务处理。
John P. Feltz

编辑:这也可能意味着创建对象来捕获正在处理的特定数据-如果您由于在这方面的方便而偏爱ORM。
John P. Feltz

除非我对此有误解,否则我认为关于该过程的任何事情都不会成为无状态的。这完全取决于用户操作的上下文。当用户创建主对象时,他们希望该子结构可立即进行修改。
尼古拉斯·皮克林

-1

为每个学生量身定制的课程,直到原始课程无法识别为止,这表明原始课程只是“默认”参考。我要做的是创建一个名为CustomizedCourse的类(或其中的一个列表),并将该类(或其中的一个列表)作为学生的财产。CustomizedCourse可以参考原始课程以进行“参考”使用,但是主要工作和数据将在CustomizedCourse本身中。


下注者有何评论?
frezq

我没有投票(我是OP),但似乎您正在尝试描述已经在另一个答案中描述的模板或策略模式。
尼古拉斯·皮克林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.