Ios 核心数据模型设计-更改“;“生活”;对象也会更改保存的对象
我正在做我的第一个核心数据项目(在iPhone上),我真的很喜欢它。核心数据是很酷的东西 然而,我遇到了一个设计难题,我不知道如何解决,尽管我认为这是一个相当普遍的情况。它涉及数据模型 为了清楚起见,我将使用一个虚构的足球游戏应用程序作为示例来说明我的问题。比如说,NSMO有一个名为Downs and Plays的游戏。播放与Downs使用的模板类似的功能。用户创建播放(例如,盗录、按钮挂钩、倾斜路线、扫描等)并填充各种属性。戏剧与唐斯有着千丝万缕的联系。对于每个向下,用户决定使用哪个播放。当向下执行时,它使用播放作为其模板。每次向下运行后,都会将其存储在历史记录中。这个程序会记住所有的下摆 到目前为止,一切顺利。这一切都很好 我的问题是,当用户想要更改一个剧本的细节时会发生什么。假设它最初涉及到向左传递,但用户现在希望它是向右传递。然而,做出这样的改变不仅会影响该剧未来的所有演出,还会改变历史上保存的剧本的细节。事实上,由于播放模板已被更改,Downs的记录被“污染” 我一直在寻找几种可能的方法来解决这个问题,但我想,美国的天才们比我更了解如何处理这个问题。不过,我提出的潜在解决方案是:Ios 核心数据模型设计-更改“;“生活”;对象也会更改保存的对象,ios,iphone,core-data,data-modeling,Ios,Iphone,Core Data,Data Modeling,我正在做我的第一个核心数据项目(在iPhone上),我真的很喜欢它。核心数据是很酷的东西 然而,我遇到了一个设计难题,我不知道如何解决,尽管我认为这是一个相当普遍的情况。它涉及数据模型 为了清楚起见,我将使用一个虚构的足球游戏应用程序作为示例来说明我的问题。比如说,NSMO有一个名为Downs and Plays的游戏。播放与Downs使用的模板类似的功能。用户创建播放(例如,盗录、按钮挂钩、倾斜路线、扫描等)并填充各种属性。戏剧与唐斯有着千丝万缕的联系。对于每个向下,用户决定使用哪个播放。当向
不久前,我在一个跟踪测试的应用程序中遇到了类似的情况;这些测试包含多个问题,可以在多个日期进行更改和重新管理。拥有一个测试模板以及单独的测试对象,使整个模型更容易处理。我认为您需要重新开始设计 (1) 为什么要使用PlayEntity作为DownEntity的模板?实体实际上是(隐藏的)类,因此类定义本身就是每个实例的“模板” (2) 托管对象应表示真实对象或真实信息关系的数据模型。因此,您需要认真思考您想要建模的真实对象或信息。一个好的开始是问问自己如何用笔和纸记录这些信息 在您的示例中,播放和播放模式完全不同 停机是按时间顺序排列的事件。在任何特定的游戏中,只有一个特定的失败。这意味着足球史上每场比赛的每一次失利都是独一无二的。因此,下跌数据模型实体主要感兴趣的是建模下跌与其他下跌和整个游戏的时间关系 相比之下,戏剧是一种空间事件。游戏不是唯一的,通常在一个游戏中以及在一个游戏之间重复。一个游戏实体应该关注球员、球和场地之间的空间关系 你会得到这样的结果:
DownEntity{
game;
half;
quarter;
turnover;
gameClockTime;
yardLine;
penalties;
play --(required,Cascade)->PlayEntity.down
previousDown --(optional, nullify)-->Down.nextDown;
nextDown --(optional, nullify)-->Down.previousDown
}
PlayEntity {
playName;
//whatever other detail you want to model
down --(optional,nullify)-->>DownEnity.play;
}
请注意,两个实体都不复制另一个实体的属性中包含的信息。他们也没有共享继承权,因为他们没有对游戏的相同方面进行建模。向下模拟时间序列,播放模拟空间序列。这需要他们两人都完整地描述各自的遭遇
您可以通过首先创建所需的任何标准化实体来构建数据库。如果您有一个新的剧本,您将创建一个新的剧本实体,并根据需要填充它。每次发生故障时,您都会创建一个故障实体,并与现有或新创建的故障实体建立关系 也许我对我目前设计的描述不够详细,而且有很多不足之处