数据库设计困境

时间:2011-03-31 18:00:43

标签: iphone database ipad core-data

我正在为报告创建一个简单的数据库应用程序。根据DB设计理论,您不应该两次存储相同的信息。这对大多数数据库应用程序都有意义,但是我需要一些你可以简单地选择一个通用主题的东西,然后你可以保持通用主题的新实例副本不变或更改信息,但不应该通过修改实例来修改通用主题复制,但需要在原始主题和主题的实例副本之间跟踪关系。

令人困惑,我知道。这是一个可能有用的图表:

Diagram 1

我需要根据情况使报告不可变或可变。

一个简单的例子是您选择一个客户,然后您完成报告。一个月后客户的电话号码发生变化,因此您更新了数据库的客户部分,但您不想提取完成的报告并将新信息更新到已完成的报告中。

这种情况最优雅的解决方案是什么?

这可能有效:

Diagram 2

但是通过利用这种方法,我会发现自己使用循环语句和if语句来识别Generic,Checked Off和Report之间的关系。

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 个答案:

答案 0 :(得分:2)

如果不完全了解你的建模究竟是什么,那么要非常精确是很棘手的,但是这里......

正如您所指出的,至少有两种策略可以获得您想要的“原型的可变实例副本”功能:

1)在基于原型创建实例时,完全从原型中复制实例数据。之后他们之间没有联系。

PRO:以更少的逻辑更快地访问实例数据。

CON 1:对原型的任何更新都不会进入实例。例如如果您在原型中有公司地址错误。

CON 2:如果您有大量记录,那么在某种程度上复制数据库数据会浪费。

2)在基于原型创建实例时,存储对“父”记录的引用,即原型,然后仅在实际实例中存储更新的字段。

PRO 1:原型的更新会反映在所有实例中。

PRO 2:更有效地利用存储空间(减少重复数据)

CON:从数据库中提取实例的更多逻辑。

总结:没有任何我能想到的神奇解决方案可以让你充分利用这两个世界。它们都是有效的策略,具体取决于您的确切问题和约束(例如,运行时速度与存储大小)。

如果你选择2),我当然不认为这是一场灾难 - 特别是如果你很好地建模并找到最有效的核心数据结构方法。