一 多对多关系时,用逗号(或者其他特殊符号)分隔的列来避免创建交叉表所带来的弊端。
比如bug表的人员id字段 , person_id=1,2,3,4,5
1 查询指定id时的弊端
将所有外键都合并在一个单元格内,查询会变得异常困难,将不能使用where 等号,你将只能使用 like 或者regexp来匹配你所要查询的某行数据,无法享受索引带来的优势,并且也是不优雅和耗时的。
2 执行聚合查询时的弊端
如 count(),avg(),sum(),这些函数是针对分组而设计的,并不能为逗号分隔的字段来服务。
3 列表长度限制 字段长度设置多少合适呢。
4 如何识别sql反模式
当你遇到如下问题时:
1 列表最多支持放多少数据?
2 你知道sql中怎么做分词查找吗?(如果你使用了正则来提取字符串组成部门,这可能是一种提示,意味着你应该把这些数据分开存储)
3 哪些字符不会出现在任何一个列表?(任何字符都有可能在某天出现在字段的某个值中)
合理使用反模式
如果你的数据是逗号分隔的,也没必要获取其中的单独值,而你只需存储和使用它们,并没有其他操作,就完全没有必要分开存储它们的值。
使用sql时,尽量规范的使用数据库设计,因为这样可以让代码和产品更加灵活,如这个多对多的关系,创建一张中间表,记录 两张表的关系就ok了。
使用中间表的好处,你可以再中间表中加入其它属性,如加入时间,或产品的第一联系人,第二联系人等。这些都是在逗号分隔的列中无法做到的。