2011-03-31 86 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