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`)
);

从那里,连接三个表的简单查询将为您提供所需的结果。

于 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

由于是多对多关系,最好有第三张表:

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 回答