Dunno如何实施以下,请帮助:
假设有以下表格:
create table dc_cities
(
id integer primary key,
name varchar(100) not null,
description varchar(100)
);
create table dc_languages
(
id integer primary key,
name varchar(100) not null,
description varchar(100)
);
create table people
(
name varchar(100),
surname varchar(100),
city integer not null references dc_cities(id),
language integer not null references dc_languages(id)
);
我想将这两个dc_表合并为单个表格(包括其他任何一种表格):
create table dc_dict
(
dc_id integer not null,
id integer not null,
primary key(dc_id, id),
name varchar(100),
description varchar(100)
);
insert into dc_dict(dc_id, id, name) values(1, 1, 'City 1');
insert into dc_dict(dc_id, id, name) values(1, 2, 'City 2');
insert into dc_dict(dc_id, id, name) values(1, 3, 'City 3');
insert into dc_dict(dc_id, id, name) values(2, 1, 'Language 1');
insert into dc_dict(dc_id, id, name) values(2, 2, 'Language 2');
insert into dc_dict(dc_id, id, name) values(2, 3, 'Language 3');
问题是,在这种情况下如何描述/创建外键/引用?当然,可以为每个引用的数据集添加一列,例如:
create table people
(
id integer primary key,
name varchar(100) not null,
surname varchar(100),
city_dict_id integer not null check(city_dict_id=1) default 1,
city integer not null,
foreign key(city_dict_id, city) references dc_dict(dc_id, id),
language_dict_id integer not null check(language_dict_id=2) default 2,
language integer not null,
foreign key(language_dict_id, language) references dc_dict(dc_id, id)
);
但目前还不清楚,需要额外的空间等。 我需要一个可移植的解决方案,因此我不能使用“虚拟”列,因为它们具有不同的语法甚至不支持(例如在PostgreSQL中)。此外,无法在视图中使用外键或在外键声明中使用常量。 当然,它可以使用触发器完成,但它不透明,我不想将声明与功能混合。 请分享您的经验 - 有没有一种正确而优雅的方式来实现它?
谢谢。