乱穿马路
需求:每一个产品均可能有多个联系人web
简单方案:将单值存储改成逗号分隔存储多值svg
经常使用逗号分隔的列表来避免在多对多关系中建立交叉表,这是一种反模式,称为乱穿马路(Jaywalking),由于能够避免十字路口性能
目标:存储多值属性
如何在一列中存储一系列相关数据的集合3d
一个帐号对应多个产品xml
每一个产品对应一个联系人blog
但每一个产品可能对应多个联系人索引
反模式:格式化的逗号分隔列表
查询指定帐号的产品
查询异常困难,不能再用等号
图片
不得不借助模式匹配字符串
困难出错且没法带来性能的优点产品
查询指定产品的帐号
多表链接也不合适
执行聚合查询
很糟糕
缺陷:
困难出错且没法带来性能的优点
多表链接也不合适
聚合查询很糟糕
更新过于麻烦
验证麻烦
选择合适的分隔符,存储的是字符串使用逗号就不合适,甚至使用任何可能出现的新字符都不合适
列表长度限制
识别
列表最多支持存放多少数据
如何分词查询
哪一个字符不会出如今任何一个列表中
合理使用
可能会须要,也可能不必使用这样的单独项。若是数据源是这样的值,而且只作存储不作修改就每必要分开。
谨慎使用,尽量用规范化的,更加灵活可变
解决方案:建立一张交叉表
将account_id存储在单独的一张表中而不是products表,每一个独立的account_id均可占据一行
展示了products和accounts的多对多
问题解决:
经过帐号查询产品和反查,使用链接查询,因为能使用索引更加高效,且更加简单
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、第二联系人
区域被添加到活动的日期,活动的主要区域、次级区域等
每一个值都应该存储在各自的行与列中。
建立交叉表