ラベル モデリング の投稿を表示しています。 すべての投稿を表示
ラベル モデリング の投稿を表示しています。 すべての投稿を表示

Core Data - モデリング考察(階層構造の保持)#2

2010年6月29日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: Core Data - モデリング考察(階層構造の保持)

いくつか思いつくままに..

階層保存用のエンティティを用意する

良い点
  • トラバーサルが楽(上位階層から下位へ簡単に降りていける)

悪い点
  • Category/SubCategory の親子関係の整合性制約をかけられない。これは別途 Validationなどを用意する必要あり。なお前回のモデリングも同じ問題あり。
  • 階層の数×2倍のエンティティになる。数が増えると扱いが煩雑になる。

課題
このモデリングでは EventCategory と Category の関連が Unidirectional Relationship(単方向関連) になっている。Core Data的には Bidirectional Relationship が望ましいが、マスタのエンティティにデータへの参照が入るのがなんとなく気になったのでこのようにした。


再帰構成にする


先のものを改良して再帰構成にしてみる( @yuma2471 さんアイディアどうも)。

汎用的になった。なお元々マスタ階層を扱っているので、階層毎に持っている情報が異なるケースが想定される(例えば、カテゴリはアイコン画像を持っているが、サブカテゴリは持っていないなど)。それらに対応するには少し一工夫が必要となる。

Core Data - モデリング考察(階層構造の保持)

2010年6月28日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Core Data での階層構造保持するケースのモデリングについて考えてみた。

(追記)Event と Category, SubCategory,... 間の関連が「単一」⇔「複数」となっているが、これは誤り。正しくは「複数」⇔「複数」。関連名も events(複数形)が望ましい。


2階層のケース


ここでは例として1つのデータと2つのマスタからなるモデルを考えてみる。
Event がデータで、Category, SubCategory がマスタ。Event 1件について、複数のカテゴリとそれに紐づく複数のサブカテゴリを設定できるものとする。この時のモデリングはどうすべきか。

最初に考えついたのはこんなもの。
ただこれは Eventに紐づく Category は管理できるものの、SubCategoryが Eventに紐づかない。

となるとこうか。
Event に2つの関連 categories と subCategories を持たせる。これら自身は階層情報を持たないので、利用する時には Category, SubCategory の関連をたどっていくことになる。

例えば、ある Event に設定されたカテゴリとサブカテゴリの一覧を表示する場合のアプローチはこう。

(1) Event の subCategories から1件 SubCategory を取得
(2) SubCategory.category から Category を取得 => 表示
(3) SubCategory を表示
(4) (1)〜(3)を繰り返す

必要なら Categoryを使ってグルーピングする。

2階層の場合はなんとなくこれでも良さそうだ。


n階層


SubSubCategory,... 等、階層が深くなる場合はそれに合わせて Event.subSubCategories,... と Eventに属性を増やして行く。

.....なにか引っかかる気もするが目的は達成できそうだ。


サブ階層がオプション(非必須)の場合


この場合、下の階層から情報を追って行く手法が使えない。これは2階層のケースでもそう。先の例の場合、SubCategoryがオプションの場合が該当する。

このケースを考慮して表示アプローチを考え直すとこんな感じ。

(1) Event の categories から Categoryを1件取得する => 表示
(2) Event の subCategories で、(1)のCategoryに該当する SubCategoriesを取得する => 表示
(3) (1)〜(2)を繰り返す

n階層の場合は (1)〜(2)と同等のことを下階層まで行って行く。

このケースで気になるのは(2)が簡単にできるかどうか。Event.subCategories は NSManagedObjectのサブクラスのプロパティとして定義され、型は NSSet になる。このままだと自前で NSSetの中をチェックすることになる。方法はともかく取得した Categoryのプロパティで SubCategoryが取り出せると使い勝手がいい(取得要求を使う?)。なお Category.subCategories は Eventに無関係の SubCategory まで含まれてしまうので使えない。


- - - -
もっと良いモデリング方法を知っていたら是非教えて下さい(コメントでどうぞ)。

人気の投稿(過去 30日間)