我在sql布局中大量使用引用,想知道这是否是一个坏习惯。当我用varchar(20)
声明引用时,postgresql是将存储使用量加倍还是仅仅使用一个隐藏的id来链接这些值?
例如:
create table if not exists distros(
name varchar(20),
primary key(name)
);
create table if not exists releases(
distro varchar(20) references distros(name),
name varchar(20),
primary key(distro, name)
);
create table if not exists targets(
distro varchar(20) references distros(name),
release varchar(20) references releases(name),
name varchar(20),
primary key (distro, release, name)
);
distro
值存储一次还是三次?谢谢
最佳答案
我很惊讶,您的列distro
不是存储一次或三次,而是存储更多。
它在你的每一张桌子里。但除此之外,您还将其作为主键的一部分,而主键又将其作为为表定义的每个索引的一部分。
这样创建表。它会节省你很多空间,而且会更快。
create table if not exists distros(
id serial,
name varchar(20),
primary key(id)
);
create table if not exists releases(
id serial,
distro_id int references distros(id),
name varchar(20),
primary key(id)
);
create table if not exists targets(
id serial,
distro_id int references distros(id),
release_id int references releases(id),
name varchar(20),
primary key (id)
);