1

MySQL で、絶対に変更されない限られた数がある場合、categoriesそれらが分類するもののテーブルに bool フィールドとしてそれらを作成する必要がありますか、それともマッピング テーブルを使用する必要がありますか? もしそうなら、なぜですか?


ケース A:

t_stuff

id (int) 
name (string) 
category_a (bool) 
category_b (bool) 
category_c (bool) 
category_d (bool) 
category_e (bool) 
category_f (bool)

ケース B:

t_stuff

id (int)
name (string)

t_categories

id (int)
name (string)

t_stuff_category

id (int)
stuff_id (int)
category_id (int)

A は B ほど「見栄えがよく」ありませんが、必要なクエリの点でははるかに単純に見えますか?

編集:私がする必要があるのは次のことだけだと付け加えるべきだと思います:

  • スタッフ行をすべて取得する
  • 1 つの特定のカテゴリを持つスタッフ行をすべて取得する
  • 特定の ID を持つスタッフ行を 1 つ取得する
4

2 に答える 2

3

ケースを使用しないでくださいA。これは、リレーショナル データベースの原則に違反しています。正規化について学びます。

idforを見つけたいとしましょう。次のcategory = 1場合に各列をチェックする必要がありますA

SELECT id 
FROM   t_stuff
WHERE  category_a = 1 
        OR category_b = 1 
        OR category_c = 1 
        OR category_d = 1 
        OR category_e = 1 
        OR category_f = 1

この設計はクエリを困難にするだけでなく、集計の悪夢でもあります。COUNT(*)特定の のカテゴリを取得したい場合はどうしますidか?

の場合B、単一の属性を照会するだけです。

SELECT stuff_id 
FROM   stuffCategory
WHERE  category_id = 1 

を取得するにはCOUNT(*)、 を置き換えるだけidです。

idさらに、下は必要ありませんt_stuff_category。( ) の複合主キーでstuff_id, category_id十分です。

于 2013-01-19T15:42:06.737 に答える
1

ここで最も重要なことは、「決して言わない」です。質問とコメントで、あなたは自信を持って次のように述べています。

  • カテゴリの数(および暗黙的に意味)は決して変更されません
  • 「アイテムXはいくつのカテゴリに含まれるか」などのクエリを実行する必要はありません。

要件は時間の経過とともに変化し、何かが決して起こらないという予測に基づいてシステムを設計すると、設計の制限を回避する必要があるため、後でフラストレーションにつながる可能性があります。

確かに、非正規化バージョン(ブール列のみ)にはいくつかの利点がありますが、実際には、「カテゴリ」の数が非常に少ない場合(<= 3)に限り、それらを次のように考えることができます。 「カテゴリ」ではなく「属性」:

  1. JOINカテゴリAまたはカテゴリBのすべての製品を検索するのは、製品が両方に含まれている場合に条項の影響を心配する必要がないため、少し簡単です。
  2. JOIN一部のクエリは、句について心配する必要がないため、記述が少し簡単です。

ブール列のセットではなく、正規化されたデザインで実行できることがいくつかあります。

  1. SQLを使用して、製品が含まれるカテゴリの数を計算するだけCOUNT()です。
  2. カテゴリ自体に関する情報を、アプリケーションコードのどこかに埋め込むのではなく、データベースに保存します。オプションBスキーマで提案されている名前列だけでなく、より長い説明や、そのカテゴリを表示するタイミングのフラグなどが必要になる場合があります。
  3. アプリケーションのコードの1行に触れることなく、カテゴリを追加、削除、または名前変更します。

繰り返しになりますが、現時点ではこれらのことを実行したくない場合がありますが、1週間以内にアプリケーションを破棄する予定がない限り、将来の要件を予測することはできません。ソフトウェア設計の大部分は、コードを保守可能にし、単純さと柔軟性の間の合理的な妥協点を構築することです。

于 2013-01-19T16:17:22.857 に答える