首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL集合存储

MySQL集合存储
EN

Stack Overflow用户
提问于 2009-04-07 20:46:14
回答 2查看 115关注 0票数 1

我在用PHP编写的web应用程序中有几个表,我想知道这是否是一个很好的实践。

代码语言:javascript
复制
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`)
)

例如,产品将是:

代码语言:javascript
复制
1,'Cup','1,2,3'

而另一种变体是:

代码语言:javascript
复制
1,'Green','Color'
2,'Glass','Texture'
3,'Blue','Color'

使得许多产品可以具有相同的颜色/纹理。我发现的问题是,我不能将其放入单个查询中,该查询将返回以下数据:

代码语言:javascript
复制
1,'Cup','1,Green,Color-2,Glass,Texture-3,Blue,Color'

然后相应地对其进行解析以显示每个变体的图像。

返回这种格式的存储函数是最好的想法吗?或者我应该进一步规范化,如果是这样的话,如何规范化?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-07 20:49:27

我认为明智的做法是添加另一个表:

代码语言:javascript
复制
CREATE TABLE `products_variations`(
  `product_id` int NOT NULL,
  `variation_id` int NOT NULL,
  PRIMARY KEY  (`product_id`, `variation_id`)
);

在此基础上,连接三个表的简单查询将为您提供所需的结果。

票数 5
EN

Stack Overflow用户

发布于 2009-04-07 20:51:04

代码语言:javascript
复制
SELECT  GROUP_CONCAT(variation_id, ', ', name, ', ', kind SEPARATOR '-')
FROM    products
INNER JOIN
        variations
ON      FIND_IN_SET(variation_id, variations)
GROUP BY
        product_id

由于这是一个多对多的关系,所以最好有第三个表:

代码语言:javascript
复制
CREATE TABLE product_variations
(
   product_id INT NOT NULL,
   variation_id INT NOT NULL,
   PRIMARY KEY (product_id, variation_id)
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/727520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档