- - PR -
スキーマ設計について質問 親子関係について
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-10-31 09:49
DB初心者です。
DBを設計する際に同じテーブルからの参照を持つような設計は するべきではないのでしょうか? 親子関係を主キーではないキーで実現したいと思っています。 具体的には以下のようなスキーマを実現したいです。 同じテーブルからの参照を持つようなテーブルを見たいことがないため まったく論外な設計かもしれませんが、どのように書き換えればよいか よろしくご教授ください。 /*==============================================================*/ /* Table: tCategory */ /*==============================================================*/ create table tCategory ( ID_CATEGORY unsigned int not null default autoincrement, CATEGORY_NAME varchar(32) not null, constraint PK_TCATEGORY primary key (ID_CATEGORY), constraint AK_AK1CATEGORY_NAME_TCATEGOR unique (CATEGORY_NAME) ); /*==============================================================*/ /* Table: tGroup */ /*==============================================================*/ create table tGroup ( ID_GROUP unsigned int not null default autoincrement, ID_CATEGORY unsigned int, ID_CHILD_CATEGORY unsigned int, DATE_STAMP datetime, USER_STAMP varchar(32), constraint PK_TGROUP primary key (ID_GROUP) ); alter table tGroup add constraint FK_TGROUP_REFERENCE_TCATEGOR foreign key (ID_CATEGORY) references tCategory (ID_CATEGORY) on update restrict on delete restrict; alter table tGroup add constraint FK_TGROUP_REFERENCE_TCHILDCATEGOR foreign key (ID_CHILD_CATEGORY) references tCategory (ID_CATEGORY) on update restrict on delete restrict; | ||||||||
|
投稿日時: 2006-10-31 11:10
テーブル tGroup の2つの列(ID_CATEGORY および ID_CHILD_CATEGORY)の両方から、テーブル tCategory を参照していることを問題とされているのでしょうか?別に構わないと思います。
この意味が良く分かりませんでした。 参照される側である、テーブル tCategory の、列 ID_CATEGORY は主キーですよね。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2006-10-31 11:18
これだとtGroupの外部キーが主キーでも一意制約でもないので、 同一の参照を持ったレコードが複数存在する状況がありえます。 この構造って木構造な親子関係にはなりませんよ? tCategoryがtGroupを挟んで多対多になるので親を複数持てます。 そういった意図でこの構造にしているのでしょうか? 前者を解決するならtGroupの外部キーを複合主キー(or 一意制約)に、 後者ならtCategoryを子から親への自己参照にすればよいです。 | ||||||||
|
投稿日時: 2006-10-31 15:57
unibonさん あしゅさん早速の回答ありがとうございます。
引用: ------------------------------------------------------------------------------- この意味が良く分かりませんでした。 参照される側である、テーブル tCategory の、列 ID_CATEGORY は主キーですよね。 ------------------------------------------------------------------------------- についてですがID_CATEGORYは主キーです。 引用: ------------------------------------------------------------------------------- >引用: >------------------------------------------------------------------------ >たくぽんさんの書き込み (2006-10-31 09:49) より: >親子関係を主キーではないキーで実現したいと思っています。 >------------------------------------------------------------------------- これだとtGroupの外部キーが主キーでも一意制約でもないので、 同一の参照を持ったレコードが複数存在する状況がありえます。 この構造って木構造な親子関係にはなりませんよ? tCategoryがtGroupを挟んで多対多になるので親を複数持てます。 そういった意図でこの構造にしているのでしょうか? ------------------------------------------------------------------------------- ご指摘のようにtGroupをはさんでtCategoryは重複を許すようにしたいです。 この多対多の関係はホントに良いのか?という疑問を持ちながら考えておりました。 たとえばtCategoryには 1 アミュージュメントパーク 2 カラオケ 3 ビリヤード 4 ゲーム 5 個室 6 パーティールーム (アミューズメントパークAのデータ) アミューズメントパーク----カラオケ +ビリヤード +ゲーム (アミューズメントパークBのデータ) アミューズメントパークB----カラオケ +ゲーム (アミューズメントパークCのデータ) アミューズメントパークC----ビリヤード +ゲーム (カラオケ屋さんAのデータ) カラオケ--------------個室 (カラオケ屋さんBのデータ) カラオケB--------------個室 +パーティールーム すみません。いくら考えてもあんまり良いサンプルが思いつかなかったのですが tCategoryの中身は1〜4 56分けれない同じ階層のデータと考えてください。 上記のようなデータを収めようとした場合 カテゴリーを自己参照するとデータのストラクチャーが決まってしまうため登録できなくなってしまいます。 tGroupの外部キー2つを複合代替キーとすると同じ構造が登録できなくなってしまいます。 すみませんがもう少しご教授ください。 よろしくお願いします。 | ||||||||
1
