名字有点怪。
其实就是交叉表的设计,或者叫中间表,联合表,多对多表,这个是最直观的。
也就是多值属性的拆分。
这里的反模式指的是将多对多的关系存放到一个字段中,用逗号分开。
这样有很多坏处:
- 索引显然是不能用了
- 增加了查询的难度,这里的难度是说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)
);
好处
- 可以添加索引了
- 可以添加额外的信息,比如一些操作时间等
- 主要联系人和次要联系人等都可以实现