mysql 多值属性_mysql一列多值多属性设计-乱穿马路

乱穿马路

需求:每一个产品均可能有多个联系人web

简单方案:将单值存储改成逗号分隔存储多值svg

经常使用逗号分隔的列表来避免在多对多关系中建立交叉表,这是一种反模式,称为乱穿马路(Jaywalking),由于能够避免十字路口性能

目标:存储多值属性

如何在一列中存储一系列相关数据的集合3d

一个帐号对应多个产品xml

每一个产品对应一个联系人blog

但每一个产品可能对应多个联系人索引

反模式:格式化的逗号分隔列表

mysql 多值属性_mysql一列多值多属性设计-乱穿马路_第1张图片

查询指定帐号的产品

查询异常困难,不能再用等号

mysql 多值属性_mysql一列多值多属性设计-乱穿马路_第2张图片图片

不得不借助模式匹配字符串

困难出错且没法带来性能的优点产品

查询指定产品的帐号

mysql 多值属性_mysql一列多值多属性设计-乱穿马路_第3张图片

多表链接也不合适

执行聚合查询

mysql 多值属性_mysql一列多值多属性设计-乱穿马路_第4张图片

很糟糕

缺陷:

困难出错且没法带来性能的优点

多表链接也不合适

聚合查询很糟糕

更新过于麻烦

验证麻烦

选择合适的分隔符,存储的是字符串使用逗号就不合适,甚至使用任何可能出现的新字符都不合适

列表长度限制

识别

列表最多支持存放多少数据

如何分词查询

哪一个字符不会出如今任何一个列表中

合理使用

可能会须要,也可能不必使用这样的单独项。若是数据源是这样的值,而且只作存储不作修改就每必要分开。

谨慎使用,尽量用规范化的,更加灵活可变

解决方案:建立一张交叉表

mysql 多值属性_mysql一列多值多属性设计-乱穿马路_第5张图片

将account_id存储在单独的一张表中而不是products表,每一个独立的account_id均可占据一行

展示了products和accounts的多对多

b58b1a52f8fc5722e9d69290e475ab3b.png

问题解决:

经过帐号查询产品和反查,使用链接查询,因为能使用索引更加高效,且更加简单

select p.* from products as p join constracts as c on(p.product_id = c.product_id) where c.account = 34;

聚合查询

select product_id,count(*) from constracts group by product_id

更新指定产品的相关联系人

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5aAQhmV-1608896591993)(乱穿马路.assets/image-20201221214154487.png)]

验证产品id

约束数据类型

不用分隔符

没有长度限制

用到索引,效率更改,添加额外属性,好比记录一个联系人被加入产品的具体日期,或产品的第1、第二联系人

区域被添加到活动的日期,活动的主要区域、次级区域等

每一个值都应该存储在各自的行与列中。

建立交叉表

你可能感兴趣的:(mysql,多值属性)