2011-06-04 22 views
0

私が書いているアプリケーションにコアデータを使用することを検討しています。しかし、ドキュメントを読んだ後は、特定の関係をモデル化する方法がわかりません。基本は次のとおりです。コアデータ:多対多関係とモデル

基本的な文字列プロパティを持つ "ProjectFile"というエンティティがあります。 (そのうちの1つは、ディスク上のファイルへのパスです - それは私のアプリケーションが操作しようとしている "ファイルX"と呼ばれます)。しかし、アプリケーションがファイルXを操作するときには、 - fileYとfileZ

FileYとFileZは、fileXのように "ProjectFile"エンティティになります。ですから、Core Dataに "FileYとFileZはFileXに関連付けられている"と言う方法が必要です。これを行うために、私は "linkedFiles"という "ProjectFile"エンティティ上に関係を作成し、 "ProjectFile"と "linkedFiles"の逆に目的地を設定しました。私はそれから、それぞれの "ProjectFile"が複数のリンクされたファイルを持つかもしれないので、これを "多対多"の関係として設定します。

これは私にとっては再帰的なようですが、正しく行っているかどうかはわかりません。 「リンクされた」ファイル(fileYとfileZ)は、fileXと同じように、単独で存在する必要があります。私はそれらを "linkedFiles"関係から "削除"できる必要がありますが、それが意味を成すならば、それらを別々に存在させる必要があります。本質的には、モデル内の別々のオブジェクト間に弱い関係が必要です。

これを正しく実行したか、または何か不足していますか?ありがとう!

答えて

0

だから、あなたは次のようになり、データモデルを持っている:(1)コアデータの関係は方向性/カーディナリティを持ち、(2)各オブジェクトは一意であるため、

ProjectFile{ 
    path:string 
    infile<<-->>ProjectFile.infile 
} 

これは動作します。あなたが問題になるのは、ルールを削除することです。この状況では、ほとんどNo ActionまたはNullifyを使用するか、カスケード削除を設定する危険性があります。その結果、リスクグラフのorphanedオブジェクトが作成され、オブジェクトグラフ内で見つけにくく関係のないオブジェクトが作成されます。

より良いモデルは、関係自体により多くの情報をエンコードします。モデル化している実世界のファイルオブジェクトは、他のファイルオブジェクトとは2つの別個の関係を持っているように見えます。(1)各インスタンスには操作するインスタンスがあり、(2)だから、あなたのモデルはそれを反映させる必要があります。

ProjectFile{ 
    path:string 
    toManipulateFiles<<-(nullify)->>ProjectFile.manipulatedByFiles 
    manipulatedByFiles<<-(nullify)->>ProjectFile.toManipulateFiles 
} 

これは、オブジェクト間の明示的な型の関係を作り、あなたが迅速かつ容易に任意の特定の操作のための右のオブジェクトを取得することができます。 1つの関係でNullifyを使用して、他方のオブジェクトを孤立させることなく使用できます。

すぐには分かりませんが、関係はグラフィカルモデルの単なる行ではなく、多くの情報を運ぶことができる実際の生きたオブジェクトです。これを念頭に置いて設計する必要があります。