Mysql 用集合数据连接表

Mysql 用集合数据连接表,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我正在为一家商店建立底层数据库。有两个表,一个是服装表,另一个是标准尺码表。服装有一个或多个尺码可供选择,尺码表包含每种尺码服装的多个尺码 示例大小图表表 id size waist chest hips height 0 6 56 76 82 160 0 8 60 80 86 162 0 10 64 84 90 164 0 12

我正在为一家商店建立底层数据库。有两个表,一个是服装表,另一个是标准尺码表。服装有一个或多个尺码可供选择,尺码表包含每种尺码服装的多个尺码

示例大小图表表

id  size    waist   chest   hips    height
0   6       56      76      82      160
0   8       60      80      86      162
0   10      64      84      90      164
0   12      68      88      94      166 
1   6       57      75      82      160
1   8       61      79      86      162
1   10      62      83      90      164
1   12      63      87      94      166
示例服装表

garment_id  garment_name    garment_type    size_chart  available_sizes
0           Boating Jacket  jacket          0           8,10,12      
1           Polka Dot Skirt skirt           1           10,12
我想做的是加入他们,这样我就

    garment_id ...  size_chart  available_sizes  size_chart.id  size_chart.size       size_chart.(...)
    0          ...   0          8,10,12      0                  8
    0          ...   0          8,10,12      0                  10
    0          ...   0          8,10,12      0                  12
    1          ...   1          10,12        1                  10
    1          ...   1          10,12        1                  12
我面临的问题是如何加入,以便我获得集合中可用的每个数字\u大小,以便有一个对应的测量条目

任何关于如何最好地做到这一点的想法/建议/建议都将非常有用

谢谢。

服装表示例

garment_id  garment_name    garment_type    size_chart  available_sizes
0           Boating Jacket  jacket          0           8,10,12      
1           Polka Dot Skirt skirt           1           10,12
是万恶之源,请跟我说:

如果我想单独访问,我永远不会在一个db字段中存储多个信息。从来没有

更重要的是,您可能希望从服装表中删除available_sizes字段,而不是执行以下操作

CREATE TABLE available_sizes (
  id INT PRIMARY KEY AUTO_INCREMENT,
  garment_id INT NOT NULL,
  INDEX(garment_id),
  size_id INT NOT NULL,
  INDEX(size_id)
)

并填充它。这样可以很容易地将一个尺码标记为已售完,甚至可以在表中添加一个qty in stock INT,搜索同一类型的所有衣服,这些衣服都有特定的尺码,等等。

一种方法是使用动态SQL。从记忆中可以看出,事情是这样的:

declare @cmd varchar(1000)

declare @id int
select @id = 0

declare @inVariable varchar(20)
select @inVariable = NULL

while(true)
begin
    select @inVariable = availables_sizes from garment where id = @id

    if (@inVariable <> NULL OR @inVariable <> '')
    begin

        if(@id > 0)
        begin
            select @cmd =
            ' UNION select g.garment_id, g.size_chart, g.availables_sizes, c.id, c.size
            from garments g
            inner join chart c on g.size_chart = c.id
                  and c.id = ' + convert(varchar, @id) + ' 
                  and c.size in (' + @invariable + ')'
        end
        else
        begin
            select @cmd =
            'select g.garment_id, g.size_chart, g.availables_sizes, c.id, c.size
            from garments g
            inner join chart c on g.size_chart = c.id
                  and c.id = ' + convert(varchar, @id) + ' 
                  and c.size in (' + @invariable + ')'
        end

        select @id = @id + 1
    end
    else
    begin
        break
    end
end

exec(@cmd)

现在,就像@EugenRieck所说的,这是邪恶的

您可以对所有行使用一个,然后在初始select子句中使用一个子select来列出一列中的大小。

LOL!好的,所以我应该做一个单独的行,每个行都有复合主键,beign id和size。我想我可以将实际的服装信息、颜色、名称等添加到另一个表中,以避免重复。请参阅我的编辑。我不确定颜色,我不是一个时尚爱好者-如果你有红色,这可能是一个想法,但如果你有朱庇特红、火红、樱桃红、富奥红a.s.o,你可能只想将它们存储为文本。永远不要说永不。我经常听到的一般规则是,首先进行规范化,然后在必要时对速度进行优化。@bnieland确切地说:在单个db字段中组合多个信息,如果您想单独访问这些信息,将不会有助于规范化或优化谢谢所有回复的人!我最终同意了@eugenrick的回答,因为这是一种最整洁的方式,让我拥有了更多我没有真正意识到的功能。非常感谢大家的发帖,大家都非常有帮助。