【问题标题】:Storing multiple values for 1 row in a record in MySQL在 MySQL 的记录中存储 1 行的多个值
【发布时间】:2012-09-11 14:52:37
【问题描述】:

好的,我知道标题听起来令人困惑,但基本上我遇到的问题是我目前的库存表如下所示:

CREATE TABLE inventory (
productid MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
category VARCHAR(100) NOT NULL,
subcategory VARCHAR(100) NOT NULL,
productname VARCHAR(150) NOT NULL,
description TEXT NOT NULL,
price DECIMAL(4,2) NOT NULL,
pathtoimage VARCHAR(150),
amountinstock SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (productid)
);

我正在构建的应用程序有两个附加字段,即“尺寸”和“颜色”。这将是一个基本上网站管理员将填写并能够添加新库存的表格。我需要它,以便他们可以为同一产品输入多种尺寸和颜色。例如:

S、M、L、XL

白色、黑色、蓝色

如何为一条记录存储这些多个值?抱歉,如果这含糊不清...我正在尽力解释它。

【问题讨论】:

  • this question 有帮助吗?
  • 嗯...我试图让它不那么复杂。但我明白你的想法。
  • 您混淆了产品和库存。产品有类别、描述、名称、图片和价格,无论它是否在库存中。

标签: mysql database database-design


【解决方案1】:

这很简单。

再添加两个表。 一种叫做尺寸,一种叫做颜色。

表格颜色: 颜色 Product_id

桌子尺寸: 尺寸 Product_id

那就很简单了

SELECT `color` FROM `colours` WHERE `product_id`='myproductid';
SELECT `Size` FROM `sizes` WHERE `product_id`='myproductid';

然后简单地遍历它。

就是这样。

如果您希望增加复杂性但可维护性,您可以创建 4 个新表

颜色:Color_ID Color_name Color_sample

尺寸:Size_ID Size_label Size_name Size_alt

表 prod_colors: Color_ID Product_id 数量

表 prod_sizes: Size_ID Product_id 数量

那就很简单了

SELECT * FROM `prod_colors` 
    JOIN `Colours` on `Colours`.`Color_id` = `prod_colors`.`Color_id`
WHERE `product_id`='myproductid' AND `qty` > '0';

SELECT `Size` FROM `sizes` 
    JOIN `Sizes` on `Sizes`.`Size_ID` = `prod_sizes`.`Size_ID`
WHERE `product_id`='myproductid' AND `qty` > '0';
  • 编辑感谢 kolossus 建议的数量列

【讨论】:

  • 所以这些颜色和尺寸表会引用 Inventory -> productid 作为外键?我应该在这两个表中有一个主键还是没有?这将是 1 个提交的表单...
  • 您额外需要的唯一主键是基本颜色和尺寸表。 prod_colors 和 Prod_sizes 表中的 prod_id 和 color_ID 和 Size_ID 都需要是索引,而不是主键。
  • 要了解更多信息,建议您阅读en.wikipedia.org/wiki/First_normal_form
  • 我尽量让它不那么复杂。如果有两个额外的表,第一个选项就足够了吗?
  • 产品是定制的吗?即它是根据要求制成特定尺寸和颜色的吗?还是每种颜色和尺寸的数量固定?如果是后者,那么您将在盘点库存时遇到问题,因为您已将数量列添加到产品表中。我建议您在颜色和尺寸表上保留 qtty 属性。
【解决方案2】:

您可以将它们作为逗号分隔的字符串存储在单个列中

【讨论】:

  • 不是一个好主意。当您需要查询单个值或 JOIN 反对它时,它几乎总是会以痛苦和遗憾告终。
  • 将其保存在单独的表中并为每个选择使用 JOIN 可能会对性能造成巨大影响
  • @MichaelT 如果您正确设置索引,则不正确。联接是数据库表存在的真正原因之一,因此您可以快速匹配联接并获取信息。
  • @MichaelT 具有正确的索引,可以忽略不计的差异,并且不像必须进行字符串操作和多个 LIKE 查询以从逗号分隔列表或 ``FIND_IN_SET 中检索单个值那样大()` 执行多个字符串操作。
  • JOINS 也是存在诸如文档数据库之类的替代方案的一个原因,我并不是说每个连接都是一个问题,但我确实看到数据库性能被上面的一些简单连接杀死了。
猜你喜欢
  • 2019-09-14
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多