【问题标题】:Should I use CSL string in MySQL database?我应该在 MySQL 数据库中使用 CSL 字符串吗?
【发布时间】:2018-02-14 21:55:11
【问题描述】:

我正在创建一个 MySQL 数据库,并有一个包含 30 多件衬衫的“衬衫”表和一个包含大约 20 种颜色的“颜色”表。由于每件衬衫可以有多种颜色,并且多件衬衫可以有相同的颜色,我应该在我的衬衫表中使用逗号分隔的列表字符串列,其中包含颜色表中颜色的 ID,还是只列出 CSL 中的颜色?此外,很多人建议不要使用 CSL,但如果我不使用 CSL,我还能如何创建它?为了将来的使用,我将制作一个表单,允许用户搜索具有特定颜色的衬衫。

【问题讨论】:

  • 一件衬衫可以有多种颜色,一种颜色可以适用于多种衬衫,这只是衬衫和颜色之间存在多对多关系的另一种说法。使用链接表建立多对多关系。
  • 是时候阅读一本关于信息建模、关系模型和数据库设计的书了。这也是一个常见问题。

标签: mysql database


【解决方案1】:

我会选择多对多的关系。

表格

衬衫
身份证
...

颜色
身份证
姓名

衬衫颜色
身份证
衬衫编号
颜色标识

为了将来的使用,我将制作一个允许用户搜索的表单 适合有特定颜色的衬衫。

如果您使用多对多关系,则查询以“红色”和“蓝色”颜色选择衬衫
由于连接而更难查询,但因为颜色仅在您无法输入错误时存储。
但这是应如何使用 anny 数据库的方式。
也使 COUNT 和分组数据更容易。

查询

SELECT
 Shirt.*
FROM 
 Shirt
INNER JOIN 
 Shirt_Color 
ON
 Shirt.id = Shirt_Color.shirt_id
INNER JOIN 
 Color 
ON
 Shirt_Color.color_id = Color.id
WHERE
 Color.name IN ('red', 'blue')

逗号分隔值方法看起来更像这样。

表格

衬衫
身份证
颜色

如果您使用逗号分隔值,则查询以“红色”和“蓝色”颜色选择衬衫
看起来更容易查询,但更容易出错,因为您需要在颜色字段中重新插入每种颜色。
使 COUNT 和对数据进行分组变得更加困难,因为您需要使用此处解释的数字生成器构建动态字符串拆分器 Restructuring a bad database with PHP loops or MySQL(也是我的帖子)

查询

SELECT
 *
FROM 
 Shirt
WHERE
   FIND_IN_SET('red', Shirt.colors)
 AND
   FIND_IN_SET('blue', Shirt.colors)

【讨论】:

  • 感谢您的建议,今晚晚些时候我会尝试一下,但看起来应该可以。
【解决方案2】:

这是一个非常主观的问题,但更好的解决方案是创建另一个表,其中包含条目 ID、衬衫 ID 和颜色 ID 列。然后,您可以使用衬衫颜色关联填充此表。每当您需要搜索特定颜色时,都可以使用此表执行连接。

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多