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