2009-04-07 12 views
1

私はPHPでコーディングしているWebアプリケーションにいくつかのテーブルを用意していますが、これがうまくいくかどうかを知りたいと思います。MySQLセットの保存

CREATE TABLE `products`(
    `product_id` int NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `variations` varchar(255) default NULL, 
    PRIMARY KEY (`product_id`) 
) 

CREATE TABLE `variations`(
    `variation_id` int NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `kind` varchar(255) default NULL, 
    PRIMARY KEY (`variation_id`) 
) 

例えば、製品は次のようになります。

1,'Cup','1,2,3' 

変動は以下のようになりますが:多くの製品は、同じ色/質感を持つことができ

1,'Green','Color' 
2,'Glass','Texture' 
3,'Blue','Color' 

ように。

1,'Cup','1,Green,Color-2,Glass,Texture-3,Blue,Color' 

、その後、各バリエーションの画像を表示するには、それに応じて、これを解析する:私は見つけるの問題は、私のようにデータを返す単一のクエリにこれに合うことができないということです。

この形式を最適な方法で返すストアド関数ですか?あるいは、私はさらに正規化すべきですか?あれば、どうですか?

答えて

5

私はへのへの賢明なものは別のテーブルを追加していると信じて:

CREATE TABLE `products_variations`(
    `product_id` int NOT NULL, 
    `variation_id` int NOT NULL, 
    PRIMARY KEY (`product_id`, `variation_id`) 
); 

そこから、3つのテーブルを結合し、単純なクエリでは、あなたが必要な結果が得られます。

+0

ああ、水のような明確な、ありがとう! – Roberto

1
SELECT GROUP_CONCAT(variation_id, ', ', name, ', ', kind SEPARATOR '-') 
FROM products 
INNER JOIN 
     variations 
ON  FIND_IN_SET(variation_id, variations) 
GROUP BY 
     product_id 

それは多対多の関係だとして、それは第三のテーブルを持っている方が良いでしょう:

CREATE TABLE product_variations 
(
    product_id INT NOT NULL, 
    variation_id INT NOT NULL, 
    PRIMARY KEY (product_id, variation_id) 
); 
+0

これは上記の答えよりも良いでしょうか?私はMySQLの性能にあまり慣れていません。 – Roberto

+0

いいえ、@ Sebの答えは素晴らしいです。私の答えはあなたが既に必要なスキーマを持っている場合にのみ良いものです。スキーマを変更して3番目のテーブルを追加できる場合は、神のためにそれを行います。 – Quassnoi

+0

おかげでQuassnoi、本当に助かりました! – Roberto

関連する問題