我有两个类,Server 和 Application,具有多对多的关系:一个服务器可以运行多个应用程序,一个应用程序可以跨多个服务器运行。第三个类 Host 表示单个服务器上的单个应用程序,包括对 Application 和 Server 对象的引用以及其他数据,例如服务器上的应用程序使用的磁盘空间量。Server 和 Application 对象都包含其所有主机的列表:因此,应用程序了解主机,主机了解应用程序,服务器了解主机,主机了解服务器。
我的项目的目的是制定将一堆应用程序迁移到新服务器上的时间表。最初,每个应用程序都有一个迁移开始日期和迁移结束日期。一些应用程序还具有虚拟化的开始和结束日期。如果迁移不能在应用程序的限制内执行(不管这些是什么),就会发生虚拟化。它发生在迁移之前并将应用程序从其约束中释放出来。Application 对象持有一个名为“Schedule”的对象,其中包括这 4 个日期以及一个表示是否要虚拟化的布尔标志,以及一个包含迁移所需工时的“月”列表(或虚拟化)每个特定月份的应用程序。
我们现在希望允许服务器在指定日期单独进行虚拟化。这些服务器上的所有应用程序(或部分应用程序,即主机)将在该日期进行虚拟化;它们将与应用程序的其余部分一起迁移。我们最初决定让服务器类拥有自己的 Schedule 对象。然后在服务器中设置虚拟化日期。但是,我们决定要保持服务器和应用程序计划的一致性 - 例如,服务器计划的迁移开始日期和结束日期应分别设置为在该服务器上运行的所有应用程序的最早开始日期和最晚结束日期服务器。这意味着每次更新应用程序日期时,我们都必须记住更新其所有服务器日期(通过主机对象)。或者,如果我们想更新应用程序'
然后我们考虑在每个 Host 对象中放置一个 Schedule 对象。这解决了一致性问题,但导致了相当多的冗余:因为属于应用程序的所有主机对象都必然具有相同的迁移日期(但可能是不同的虚拟化日期),当您为应用程序设置迁移日期时,您有为每个主机设置相同的日期。此外,在某些情况下,我们需要计算出服务器和应用程序的最早开始日期和最晚结束日期,如上所述。这将涉及:在每个应用程序和服务器对象中保存此数据(有效地为每个对象提供自己的调度,从而带回一致性问题),或者:通过循环在每次需要时动态计算此数据通过所有主持人的日程安排。应用程序每月所需的工时也是如此,它是在应用程序级别计算的,每个主机每月分成几小时,然后在我们需要在应用程序级别再次计算时重新计算。正如您所料,这丝毫没有效率。
这不是一个简单的问题,但我想知道是否有任何公认的策略来处理这种情况。提前抱歉我的帖子冗长;希望我已经把情况说得够清楚了。