ページ

2010年5月19日水曜日

CoreData - リレーションシップ(3) 多対多のモデリング

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

(前回)Cocoaの日々: CoreData - リレーションシップ(2) SQLiteのスキーマ

モデリングを見直し、逆関連(inverse)かつ対多関連を追加してみた。


それぞれの関連設定は次の通り。


すると今度はうまくいった。
何度実行してもきちんとタグが表示される。

[15414:10b] title=iPad 5/28発売
[15414:10b] *tag*: iPad
[15414:10b] title=CoreData のリレーションしっぷについて
[15414:10b] *tag*: iPad
[15414:10b] *tag*: iPhone
[15414:10b] *tag*: Mac



SQLite を見てみよう。
sqlite> .tables
ZBLOGENTRY    ZTAG          Z_1TAGS       Z_METADATA    Z_PRIMARYKEY
新しく Z_1TAGS テーブルが追加されているのが分かる。

sqlite> .schema z_1tags
CREATE TABLE Z_1TAGS ( Z_1ENTRIES, Z_2TAGS );
CREATE INDEX Z_1TAGS_Z_1ENTRIES_INDEX ON Z_1TAGS (Z_1ENTRIES);
CREATE INDEX Z_1TAGS_Z_2TAGS_INDEX ON Z_1TAGS (Z_2TAGS);

中身を見ると、いわゆる中間テーブルで ZBLOGENTRY と ZTAG へのリレーションを持っている。
データはこんな感じ。
sqlite> select * from z_1tags;
2|1
2|2
2|3
1|1


ZTAGはどうか。
sqlite> .schema ztag
CREATE TABLE ZTAG (
  Z_ENT INTEGER,
  Z_PK INTEGER PRIMARY KEY,
  Z_OPT INTEGER,
  ZNAME VARCHAR );

Z1TAG が無くなって、基本属性値だけになっている。

ER図はこんな感じ。


- - - -
なるほど。タグのような多対多関連はこんな感じでモデリングするのか。