我正在为报表创建一个简单的数据库应用程序。根据数据库设计理论,不应该将相同的信息存储两次。这对于大多数数据库应用程序来说是有意义的,但是我需要一些东西,您可以简单地选择一个通用主题,然后您可以保持通用主题的新实例副本不变,或者更改信息,但是不应该通过修改实例副本来修改通用主题,但是需要跟踪原始主题和主题的实例副本之间的关系。
我知道,我很困惑。下面是一个可能有帮助的图表:
我需要的报告是不变的或可变的根据情况。
一个简单的例子是选择一个客户,然后完成报告。一个月后,客户的电话号码发生了更改,因此您更新了数据库的客户部分,但您不希望调出已完成的报告并将新信息更新到已完成的报告中。
对于这种情况,什么是最优雅的解决方案?
这可能有效:
但通过使用这种方法,我会发现自己使用循环语句和if语句来标识泛型、签出和报表之间的关系。
for (NSManagedObject *managedObject in checkedOffTaskObjects) {
if ([[reportObject valueForKeyPath:@"tasks"] containsObject:managedObject]) {
if ([[managedObject valueForKeyPath:@"tasks"] containsObject:genericTaskObjectAtIndexPath]) {
cell.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellbackground.png"]] autorelease];
}
}
}
我知道有更好的解决办法,但我看不见。
谢谢你抽出时间。
最佳答案
在不知道你到底在做什么模特的情况下,要做到非常精确是很困难的,但是这里…
正如您所注意到的,至少有两种策略可以获得您想要的“原型的可变实例副本”功能:
1)基于原型创建实例时,从原型中完全复制实例数据。之后他们之间没有联系。
pro:更快地访问实例数据,所涉及的逻辑更少。
问题1:对原型的任何更新都不会进入到实例中。如果你在原型中有一家公司的地址错了。
缺点2:如果有大量的记录,在一定程度上复制数据库数据是浪费资源的。
2)基于原型创建实例时,存储对“父”记录(即原型)的引用,然后只在实际实例中存储更新的字段。
pro 1:原型的更新反映在所有实例中。
Pro 2:更有效地利用存储空间(减少重复数据)
con:关于从数据库中提取实例的更多逻辑。
总而言之:我想没有什么神奇的解决方案能让你在这两个世界中都得到最好的。它们都是有效的策略,具体取决于您的具体问题和约束(例如,运行时速度与存储大小)。
如果你选择2),我当然不认为这是一场灾难——特别是如果你对事物进行了良好的建模,并找到了在核心数据中构造事物的最有效方法。