製品ごとに異なるテーブルが必要かどうかを知りたいようですね。これは、データベースの正規化がどのように機能するかではありません。
タイプ (データベースの世界では「エンティティ」と呼ばれます) に基づいてテーブルを分離したいと考えています。
あなたの例はかなり些細なことのようです。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
。
したがってwarnings
、classifications
、 などに非常に構造化された値 (または製品ごとに複数の値) がある場合は、それらを実際に新しいテーブルに入れる必要があります。
あなたがそれらの他の分野で何をするつもりなのか、私にはわかりません。では、よく使われる架空のフィールドの具体例を挙げてみましょう。
の製品を追跡したいとしますcategory
。product
このために、テーブル内のカテゴリ名の 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 プレーヤー、ステレオ システムなどの製品が返されます。