Sql 转化为正规形式

Sql 转化为正规形式,sql,postgresql,constraints,Sql,Postgresql,Constraints,有区域、化身和区域实例。对于每个区域,化身必须属于零个或一个实例 CREATE TABLE zones ( id SERIAL NOT NULL PRIMARY KEY, name VARCHAR NOT NULL, ... ); CREATE TABLE avatars ( id SERIAL NOT NULL PRIMARY KEY, ... ); CREATE TABLE instances ( id SERIAL NOT NULL PR

有区域、化身和区域实例。对于每个区域,化身必须属于零个或一个实例

CREATE TABLE zones (
    id SERIAL NOT NULL PRIMARY KEY,
    name VARCHAR NOT NULL,
    ...
);

CREATE TABLE avatars (
    id SERIAL NOT NULL PRIMARY KEY,
    ...
);

CREATE TABLE instances (
    id SERIAL NOT NULL PRIMARY KEY,
    zone_id INTEGER REFERENCES zones NOT NULL,
    ...
);

CREATE TABLE avatar_instances (
    avatar_id INTEGER REFERENCES avatars NOT NULL,
    zone_id INTEGER REFERENCES zones NOT NULL,
    instance_id INTEGER REFERENCES instances NOT NULL,
    PRIMARY KEY(avatar_id, zone_id)
);
我对上面的模式不满意,因为
avatar\u实例中每个记录中的
zone\u id
必须与相应
实例中的
zone\u id
一致

理想情况下,我希望在avatar_实例上有一个唯一的索引,该索引“到达
实例
表的内部”,以查看
实例.zone_id

e、 g


如何将该模式转换为第n个正常形式,同时保留“每个化身必须属于每个区域的零个或一个实例”的限制?

创建一个unique并添加一个复合FK引用unique

CREATE TABLE instances (
    id SERIAL NOT NULL PRIMARY KEY,
    zone_id INTEGER REFERENCES zones NOT NULL,
    UNIQUE (zone_id, id)
);

CREATE TABLE avatar_instances (
    avatar_id INTEGER REFERENCES avatars NOT NULL,
    zone_id INTEGER NOT NULL,
    instance_id INTEGER NOT NULL,
    CONSTRAINT fk_ai2i FOREIGN KEY (zone_id, instance_id) REFERENCES instances (zone_id, id),
    PRIMARY KEY(avatar_id, zone_id)
);
允许在
化身\u实例中为空。如果化身必须属于每个区域的零个或一个实例,则实例\u id

CREATE TABLE zones (
    id SERIAL NOT NULL PRIMARY KEY,
    name VARCHAR NOT NULL,
    ...
);

CREATE TABLE avatars (
    id SERIAL NOT NULL PRIMARY KEY,
    ...
);

CREATE TABLE instances (
    id SERIAL NOT NULL PRIMARY KEY,
    zone_id INTEGER REFERENCES zones NOT NULL,
    ...
);

CREATE TABLE avatar_instances (
    avatar_id INTEGER REFERENCES avatars NOT NULL,
    zone_id INTEGER REFERENCES zones NOT NULL,
    instance_id INTEGER REFERENCES instances NOT NULL,
    PRIMARY KEY(avatar_id, zone_id)
);