《SQL反模式》笔记(一)

533 阅读1分钟

反模式是一种试图解决问题的方法,但通常会同时引发别的问题。反模式虽然以不同的形式被广泛实践,但者其中存在一定的共通性。

反模式是一种试图解决问题的方法,但通常会同时引发别的问题。反模式虽然以不同的形式被广泛实践,但者其中存在一定的共通性。

乱穿马路

数据库中原来存储单一用户标识的字段改成使用逗号分隔的用户标识列表,实际上灵活性不够。只能存放规定大小的字符。

程序员通常使用逗号分隔的列表来避免再多对多的关系中创建交叉表,作者将这种设计方式定义为一种反模式,称为乱穿马路。

目标:存储多值属性

产品、帐号、联系人多对多关系

一列中存储一系列相关数据的集合。

反模式:格式化的逗号分隔列表

会受到列表长度限制。

如 VARCHAR(30) 的结构中能存储的数据依赖与每个条目的长度。如果每个条目只有两个字符长,那么能存10个条目,包含逗号。

解决方案

创建一张交叉表

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