乱穿马路

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

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

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

目标:存储多值属性

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

一个帐号对应多个产品xml

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

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

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

mysql 将一列的结果拼接_字符串

查询指定帐号的产品

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

mysql 将一列的结果拼接_多对多_02

图片

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

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

查询指定产品的帐号

mysql 将一列的结果拼接_mysql 将一列的结果拼接_03

多表链接也不合适

执行聚合查询

mysql 将一列的结果拼接_多对多_04

很糟糕

缺陷:

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

多表链接也不合适

聚合查询很糟糕

更新过于麻烦

验证麻烦

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

列表长度限制

识别

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

如何分词查询

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

合理使用

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

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

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

mysql 将一列的结果拼接_多对多_05

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

展示了products和accounts的多对多

mysql 将一列的结果拼接_mysql 多值属性_06

问题解决:

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

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

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


验证产品id

约束数据类型

不用分隔符

没有长度限制

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

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

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

建立交叉表