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

09-11 18:14
查看更多