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

乱穿马路

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

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

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

目标:存储多值属性

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

一个帐号对应多个产品xml

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

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

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

fd0b0090aad64bbe15267dff09eb63ae.png

查询指定帐号的产品

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

748b96bb273812807fee35a4602bc24f.png图片

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

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

查询指定产品的帐号

3805571af259831c3cf2160484656fa5.png

多表链接也不合适

执行聚合查询

3f74253eb8baa7e5474f7287d247d53d.png

很糟糕

缺陷:

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

多表链接也不合适

聚合查询很糟糕

更新过于麻烦

验证麻烦

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

列表长度限制

识别

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

如何分词查询

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

合理使用

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

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

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

6d99f1c9e557c963319b62b602f5c928.png

将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、第二联系人

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

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

建立交叉表

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值