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)
);

好处

  • 可以添加索引了
  • 可以添加额外的信息,比如一些操作时间等
  • 主要联系人和次要联系人等都可以实现

你可能感兴趣的:(SQL反模式-乱穿马路)