【发布时间】:2010-03-29 19:39:34
【问题描述】:
我正在开发我的第一个 Core Data 项目(在 iPhone 上),我非常喜欢它。 Core Data 是很酷的东西。
然而,我遇到了一个我不确定如何解决的设计难题,尽管我认为这是一个相当普遍的情况。它涉及数据模型。
为了清楚起见,我将使用一个虚构的足球游戏应用作为示例来说明我的问题。假设有NSMO,称为Downs and Plays。播放 Downs 使用的模板等功能。用户创建 Plays(例如,Bootleg、Button Hook、Slant Route、Sweep 等)并填写各种属性。戏剧与唐斯有一对多的关系。对于每个 Down,用户决定使用哪个 Play。当 Down 被执行时,它使用 Play 作为它的模板。每次 down 运行后,它都存储在历史记录中。该程序会记住所有播放过的 Downs。
到目前为止,一切都很好。这一切都很好。
我的问题是当用户想要更改 Play 的详细信息时会发生什么。假设它最初涉及向左的传球,但用户现在希望它成为向右的传球。但是,进行该更改不仅会影响该 Play 的所有未来执行,还会更改存储在历史中的 Play 的详细信息。实际上,Downs 的记录被“污染”了,因为 Play 模板已更改。
我一直在尝试几种可能的解决方案来解决这种情况,但我想 SO 的天才们比我更了解如何处理这种情况。尽管如此,我想出的潜在修复是:
剧本的“版本控制”。对 Play 模板的每次更改实际上都会创建一个具有相同名称的新的、单独的 Play 对象(据用户所知)。然而,在引擎盖下,它实际上是一个不同的游戏。这会起作用,AFAICT,但似乎它可能会导致 Play 对象的疯狂扩散,尤其是。如果用户不断在同一个 Play 的多个版本之间来回切换(每次用户切换时创建一个又一个对象)。是的,该应用程序可以检查预先存在的、相同的 Play,但是……它看起来就像一团糟。
Have Downs 在保存时记录他们使用的 Play 的详细信息,但不作为 Play 对象。这看起来很荒谬,因为 Play 对象是存在来保存这些细节的。
认识到 Play 对象实际上实现了 2 个功能:一个是 Down 的模板,另一个是记录使用的模板。这两个函数与 Down 有不同的关系。第一个(模板)具有一对多的关系。但是第二个(记录)具有一对一的关系。这将意味着创建第二个对象,例如“Play-Template”,它将保留与 Downs 的多对多关系。 Play 对象将被重新配置为与 Downs 具有 一对一 关系。 Down 将使用 Play-Template 对象执行,但使用新类型的 Play 对象来存储使用的模板。正是这种从一对多关系到一对一关系的变化代表了问题的症结所在。
即使把这个问题写出来也让我变得更清楚了。我认为像解决方案 3 这样的东西就是答案。但是,如果有人有更好的主意,甚至只是确认我走在正确的轨道上,那将很有帮助。 (请记住,我并不是真的在制作足球游戏,只是使用每个人都理解的比喻更快/更容易。)
【问题讨论】:
标签: ios iphone core-data data-modeling