(追記)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 まで含まれてしまうので使えない。
- - - -
もっと良いモデリング方法を知っていたら是非教えて下さい(コメントでどうぞ)。
Responses
Leave a Response