SQL反模式-乱穿马路

名字有点怪。
其实就是交叉表的设计,或者叫中间表,联合表,多对多表,这个是最直观的。
也就是多值属性的拆分。
这里的反模式指的是将多对多的关系存放到一个字段中,用逗号分开。
这样有很多坏处:

  • 索引显然是不能用了
  • 增加了查询的难度,这里的难度是说sql语句更难写了,只有及其少数的操作优化了,是哪个操作就显而易见了。
  • 列表的长度有限制,比如varchar的字段长度是有限的。

例子

一个产品可能有多个联系人。
可以这样设计:

CREATE TABLE Contacts (
  product_id BIGINT UNSIGNED NOT NULL,
  account_id BIGINT UNSIGNED NOT NULL ,
  PRIMARY KEY (product_id,account_id),
  FOREIGN KEY (product_id) REFERENCES Products(product_id),
  FOREIGN KEY (account_id) REFERENCES Accounts(account_id)
);

好处

  • 可以添加索引了
  • 可以添加额外的信息,比如一些操作时间等
  • 主要联系人和次要联系人等都可以实现
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容