2011-03-31 78 views
3

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

令人困惑,我知道。这里有一个图表,可以帮助:

Diagram 1

我需要的报告基于关闭的情况是不可变的或可变的。

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

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

这可能工作:

Diagram 2

但是利用这种方法我会用循环语句发现自己和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]; 
     }    
    } 
} 

我知道存在更好的解决方案,但我看不到它。

谢谢你的时间。

+0

在你的示例代码中,我把它的意思是“在checkedOffTaskObjectS”(复数,小写)?如果你用大写字母编写ivars,因为它们看起来像类,这很让人困惑。 – occulus 2011-03-31 18:35:40

+0

并应该@“任务”是@“任务”?多数人的错误使得你很难理解你在做什么,你能修正你的代码示例吗? – occulus 2011-03-31 18:41:35

+0

在你的示例代码中,达到“...”意味着什么?您正在检查的检出的任务对象是否在当前的报告中,并且这是一个通用任务? – occulus 2011-03-31 18:49:54

回答

2

是相当棘手的是非常精确的,无需了解你在造型正是很多,但在这里不用...

如您所知,至少还有两种策略来获得的“可变实例副本原型“功能:

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

PRO:更快地访问实例数据,涉及的逻辑较少。

CON 1:对原型进行的任何更新都不会使其进入实例。例如如果你的原型地址有错误的话。

CON 2:您正在复制数据库数据 - 在某种程度上 - 如果您有大量记录,则会造成浪费。

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

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

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

CON:围绕从数据库中提取的实例的详细逻辑。

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

如果你喜欢2),我当然不认为这是一场灾难 - 尤其是如果你对事物建模并找出最有效的方式来构建核心数据结构。

+0

我选择了第二个选项。它的工作原理和运行速度似乎可以接受大量的样本数据。感谢您的时间和意见。它有助于了解这种情况不存在银弹。 – Unixed 2011-03-31 21:39:27