各タグがカテゴリにグループ化されていることを除いて、タグ付けのためのデータベース設計のようなものにしようとしています。
たとえば、車両に関するデータベースがあるとします。実際には車両についてあまり知らないとしましょう。そのため、すべての車両にある列を指定することはできません。したがって、車両に情報を「タグ付け」します。
1. manufacture: Mercedes
model: SLK32 AMG
convertible: hardtop
2. manufacture: Ford
model: GT90
production phase: prototype
3. manufacture: Mazda
model: MX-5
convertible: softtop
ご覧のとおり、すべての車が製造元とモデルでタグ付けされていますが、他のカテゴリはすべて一致しているわけではありません。車は各カテゴリの 1 つだけを持つことができることに注意してください。すなわち。車には 1 つのメーカーしかありません。
すべてのメルセデスの検索をサポートするデータベース、またはすべてのメーカーを一覧表示できるデータベースを設計したいと考えています。
私の現在のデザインは次のようなものです:
vehicles
int vid
String vin
vehicleTags
int vid
int tid
tags
int tid
String tag
int cid
categories
int cid
String category
各車のメーカーが 1 つしかない場合を除いて、適切な主キーと外部キーがすべて適切に配置されています。それともできますか?
vehicleTags の複合主キーに外部キー制約を追加できますか? すなわち。複合主キー (vid、tid) を vehicleTags に追加できるのは、同じ vid に対して既に tid が存在しないような行がまだ vehicleTags にない場合に限るような制約を追加できますか?同じシド?
私の推測ではノーです。この問題の解決策は、cid 列を vehicleTags に追加し、新しい複合主キー (vid、cid) を作成することだと思います。次のようになります。
vehicleTags
int vid
int cid
int tid
これにより、自動車に 2 つのメーカーが存在することはなくなりますが、tid が cid にあるという情報を複製しました。
私のスキーマはどうあるべきですか?
Tom は、私のデータベース スキーマにあるこの問題に、以前の質問であるHow do you do many to many table outside join?で気付きました。
編集
例では、製造は実際には車両テーブルの列である必要があることを知っていますが、それができないとしましょう。例はほんの一例です。