SQL反模式(一)

一 多对多关系时,用逗号(或者其他特殊符号)分隔的列来避免创建交叉表所带来的弊端。

比如bug表的人员id字段 , person_id=1,2,3,4,5

1 查询指定id时的弊端

将所有外键都合并在一个单元格内,查询会变得异常困难,将不能使用where 等号,你将只能使用 like 或者regexp来匹配你所要查询的某行数据,无法享受索引带来的优势,并且也是不优雅和耗时的。
图片来自sql反模式

2 执行聚合查询时的弊端

如 count(),avg(),sum(),这些函数是针对分组而设计的,并不能为逗号分隔的字段来服务。

3 列表长度限制 字段长度设置多少合适呢。
4 如何识别sql反模式

当你遇到如下问题时:
1 列表最多支持放多少数据?
2 你知道sql中怎么做分词查找吗?(如果你使用了正则来提取字符串组成部门,这可能是一种提示,意味着你应该把这些数据分开存储)
3 哪些字符不会出现在任何一个列表?(任何字符都有可能在某天出现在字段的某个值中)

合理使用反模式

如果你的数据是逗号分隔的,也没必要获取其中的单独值,而你只需存储和使用它们,并没有其他操作,就完全没有必要分开存储它们的值。
使用sql时,尽量规范的使用数据库设计,因为这样可以让代码和产品更加灵活,如这个多对多的关系,创建一张中间表,记录 两张表的关系就ok了。
使用中间表的好处,你可以再中间表中加入其它属性,如加入时间,或产品的第一联系人,第二联系人等。这些都是在逗号分隔的列中无法做到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值