0

データを別のテーブルに入れる必要があるか、製品ごとに 1 つのテーブルにまとめる必要があるかは、どうすればわかりますか? 一般的なルールやベストプラクティスはありますか?

例えば。

製品には、名前、ブランド、分類、指示、警告、推奨される使用法、コメント、注意、制限があります。

個別のテーブルを使用することですべての製品がどのように役立つかを確認できましたが、1 つの製品テーブルの下にあるコンマ区切りのエントリでも同じように機能するでしょうか?

リレーショナル データベースが過剰か不可欠かをどのように判断しますか?

4

4 に答える 4

5

コンマ区切りのリストを保存することを検討している場合は、それを別のテーブルに分割する必要があることは明らかです。列ごとに複数の値を格納しないでください。

データベースの正規化の詳細については、こちらをお読みください: http://en.wikipedia.org/wiki/Database_normalization

さらに詳しく説明すると、優れたデータベース スキーマを設計することは、芸術のように感じることがあります。時間と経験を積むことで、より上手になるでしょう。物事を試すのを恐れるほど、間違いを犯すことを心配する必要はありません。

しかし、リレーショナル データベース理論は 30 年以上前から存在しており、標準的な方法を学ぶことで多くの苦痛を回避できることも理解してください。

于 2012-11-03T19:05:57.487 に答える
2

値をコンマで区切っている場合は、データを別のテーブルに移動するのに適した時期です。

データが特定の種類のデータを含むテーブルにきちんと整理されると、レコードの選択が容易になります。

たとえば、タグ。はい、製品テーブルにタグを CSV として保存できますが、「ユーティリティ」とタグ付けされたすべての製品を取得するにはどうすればよいでしょうか? すべてのレコードを選択し、タグをカンマで配列に分割してから、製品コレクションを反復処理して関連するものを探す必要があります。これはほんの一例です。保存するレコードと複雑なデータが増えるほど、これがどのように成長するかがおわかりいただけると思います。

于 2012-11-03T19:05:26.883 に答える
1

テーブルに冗長なデータがある場合は常に、新しいテーブルを作成する必要があることを示しています。上記の製品で使用した例では、次のようになります。

製品には、名前、ブランド、分類、指示、警告、推奨される使用法、コメント、注意、制限があります。

分類は、別の表にリストしたい明確な項目です。これにより、データが正規化されます。したがって、上記の例では、ブランド用、分類用、製品用の少なくとも 3 つのテーブルが必要です。複数のメモが必要で、メモが追加されたさまざまな時間を追跡する場合は、そのためのテーブルを作成できます。これにより、データの検索が容易になり、たとえば、widgetgroup 分類のすべてのウィジェットを再分類したい場合、製品テーブルのすべてのレコードではなく、分類テーブルのグループの名前を更新するだけで済みます。

ウィキペディアのトピックへのリンクは次のとおりですhttp://en.wikipedia.org/wiki/Database_normalization

于 2012-11-03T19:31:12.950 に答える
1

製品ごとに異なるテーブルが必要かどうかを知りたいようですね。これは、データベースの正規化がどのように機能するかではありません。

タイプ (データベースの世界では「エンティティ」と呼ばれます) に基づいてテーブルを分離したいと考えています。

あなたの例はかなり些細なことのようです。CSV をどこで使用する予定だったのかわかりません。ただし、これらのフィールドのいくつかに非常に構造化された値があるかどうかはわかりません (「分類」または「警告」を構成するものは何ですか?)。

とにかく、簡単な例:

CREATE TABLE brand (
    brand_id INT PRIMARY KEY,
    brand_name VARCHAR(100)
);

CREATE TABLE product (
    product_id INT PRIMARY KEY,
    brand_id INT,
    classifications VARCHAR(200),
    directions VARCHAR(200), 
    warnings VARCHAR(200), 
    recommended_use VARCHAR(200),
    comments VARCHAR(200),
    notes VARCHAR(200),
    restrictions VARCHAR(200)
);

そして、すべてのSony製品を照会したい場合は、次のようにします。

SELECT * 
FROM product
JOIN brand
USING (brand_id)
WHERE brand_name = 'Sony';

テーブル内の他のフィールドのいくつかproductがより構造化されている場合は、 の場合と同じようにそれらを分割する必要がありますbrand

したがってwarningsclassifications、 などに非常に構造化された値 (または製品ごとに複数の値) がある場合は、それらを実際に新しいテーブルに入れる必要があります。

あなたがそれらの他の分野で何をするつもりなのか、私にはわかりません。では、よく使われる架空のフィールドの具体例を挙げてみましょう。

の製品を追跡したいとしますcategoryproductこのために、テーブル内のカテゴリ名の CSV を使用する人もいます。

ただし、さらに 2 つのテーブルを作成できます。

CREATE TABLE category (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(100)
);

CREATE TABLE product_category (
    product_id INT,
    category_id INT,
    PRIMARY KEY(product_id, category_id)
);

そのため、テーブルに複数のエントリを含めることで、製品に複数のカテゴリを含めることができproduct_categoryます。

したがって、検索したい場合Sony Electronics

SELECT product.* 
FROM product
JOIN brand
USING (brand_id)
JOIN product_category
USING (product_id)
JOIN category
USING (category_id)
WHERE brand_name = 'Sony'
AND category_name = 'Electronics';

これにより、テレビ、DVD プレーヤー、ステレオ システムなどの製品が返されます。

于 2012-11-03T19:31:42.480 に答える