2010-08-06 49 views
1

我有一個數據庫設計已足夠標準化,但現在我需要添加一個新表(實體,因爲我實際上使用核心數據),而且我遇到了一些的問題。數據庫設計問題 - 保持關係至少

景觀有許多評估
評估具有一個AssessmentType
AssessmentTree具有一個評估
AssessmentTree具有彼此12個實體中的一個,省略了空間。

現在,我添加一個Photo實體,它可以與任何上述實體關聯。我需要建立某種關係,例如我可以只抓取與AssessmentTree相關的照片,或者可能是評估,這將是與評估樹相關的照片的超集。

(我覺得我可能不會做了偉大的工作,說明情況,所以讓我知道如果我能以某種方式澄清。)

可能的解決方案,我認爲,其中沒有一個是令人滿意的:

  1. 從Photo實體內創建對的每隔一個對象的引用。那麼無參考文獻就意味着照片不是該集合的一部分。
  2. 創建一個新的實體PhotoRelations,該實體將持有對照片的引用和對其所附對象之一的引用。問題是,雖然我可以很容易地用SQL系統做到這一點,但我想不出如何將它轉換成CoreData。

任何幫助將不勝感激!

回答

2

Core Data旨在處理此問題的方式是通過實體繼承。

理論上,您可以像使用子類定義的非核心數據對象一樣處理這種情況。您將定義一個鏈接到具體照片實體的抽象父實體。那麼你會讓所有需要照片的實體繼承該父實體。

但是,由於SQL存儲的實現細節,任何圖中父實體的所有子實體最終都在磁盤上的同一個SQL表中。這可能會降低獲取性能,因爲即使只是獲取一個實體,也必須搜索存儲在表中的所有子實體的所有實例。

這是一種痛苦。我一直希望他們能夠將這個限制折射出來。

您可以使用測試數據測試實體繼承,並查看您的特定實現是否存在問題。如果您只有幾千個可以獲取簡單屬性(字符串,數字,日期等)的子實體,那麼您可以使用實體繼承而不會有任何顯着的性能影響。

+0

我已經實現了這一點,它大部分都是我需要的,但我希望能夠爲每個實體關聯多張照片,這對於此方法來說似乎很難。建議? – 2010-08-09 16:10:39

+0

將父母中的照片關係更改爲多人。這可以讓您將任意數量的照片與子實體的每個實例相關聯。 – TechZen 2010-08-09 19:44:48

+0

工作很好,謝謝。 – 2010-08-09 20:14:36

0

你可以做的是創建一個像這樣的關係表:

linkedId | photoId |鏈接類型

鏈接類型可以是任何上述所列爲整數1-N

+0

這似乎與我的第二個想法不同,並且需要爲每個其他實體添加一個id字段,以及一組額外的代碼來跟蹤所述id。 – 2010-08-06 19:35:24

2

由於Photo是個孩子,我會去你的第一個選項,並創建一個鏈接到每個實體。

但是,您計劃在Photo中存儲什麼?如果它只是二進制數據,那麼我會重新考慮它,並將filePath存儲到磁盤上的映像中。在Core Data中存儲二進制數據並不理想。然後,如果您只是簡單地存儲文件路徑,則可以完全跳過實體並將filePath存儲在父對象中。