1

PHPでコーディングしているWebアプリケーションにいくつかのテーブルがありますが、これが適切かどうかを知りたいと思います。

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'

その後、これを適宜解析して、各バリエーションの画像を表示します。

その形式を返すストアド関数は最良のアイデアですか?または、さらに正規化する必要がありますか?もしそうなら、どのように?

4

2 に答える 2

5

賢明なことは、別のテーブルを追加することだと思います。

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

そこから、3つのテーブルを結合する単純なクエリにより、必要な結果が得られます。

于 2009-04-07T20:49:26.887 に答える
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

多対多の関係であるため、3番目のテーブルを用意することをお勧めします。

CREATE TABLE product_variations
(
   product_id INT NOT NULL,
   variation_id INT NOT NULL,
   PRIMARY KEY (product_id, variation_id)
);
于 2009-04-07T20:51:03.890 に答える