0

どのコンテンツにもタグを付けることができるデータベースを設計しており、特定のタグを持つすべてのコンテンツを選択できるようにしたいと考えています。

次の 2 つのオプションについて悩んでおり、アドバイスをいただければ幸いです。もっと良い方法があれば教えてください。

オプション A
複数の「多対多」結合テーブル。

鬼ごっこ:
  ID
  鬼ごっこ

メディア:
  ID
  題名
  ソース
  作成

メディアタグ:
  ID
  media_id
  tag_id

論文:
  ID
  題名
  コンテンツ
  作成

記事タグ:
  ID
  article_id
  tag_id

オプション B
「テーブル」列を使用して結合先のテーブルを識別する単一の「タグ参照」テーブル。

鬼ごっこ:
  ID
  鬼ごっこ

タグ参照:
  ID
  行 ID
  tag_id
  テーブル

メディア:
  ID
  題名
  ソース
  作成

論文:
  ID
  題名
  コンテンツ
  作成

メンテナンスの観点からは、オプション B が好ましいように見えますが、SQL クエリですべてのコンテンツを選択することを考えると、複数のクエリなしでは不可能だと思います。

4

4 に答える 4

2

オプション Bを使用する場合、他のテーブルへの外部キーを設定することはできません。したがって、オプション Aを使用し、m:n 関係ごとに 1 つのテーブルを使用します。

「メンテナンスの観点からオプション B」 – 悪夢です。記事を削除するとどうなりますか?それを含むすべての行row_idはテーブルに保持されtag_referenceます。これらのエントリは常に手動で更新する必要があります。

于 2012-10-16T08:22:27.430 に答える
1

オプションBには多値従属性が含まれているため、第4正規形に違反しています。私はオプションAがとても好きです

于 2012-10-16T08:27:59.473 に答える
0

実際、それはすべてのSQL開発者に依存します。しかし、テーブル内の特定の列が(それが true であると仮定してOption A) 他のテーブルのものであることを簡単に知ることができるので、私は好みます。foreign key

Option Bテーブル名を列に格納するのは悪い考えであるため、やや悪い設計です。IFあなたはもっと、またはCASEここで過ごすことができます。

于 2012-10-16T08:18:48.313 に答える
0

2 番目のオプションでは、効率的な SQL のために JOIN を使用することがほとんどできず、低速の複数選択を使用せざるを得なくなります。

したがって、最初のオプションがはるかに望ましいと言えます。

于 2012-10-16T08:26:23.263 に答える