我有三张桌子。列出对象的两个基本表和记录数据库中的更改的第三个表。这是一个例子。
create table individual (ind_id integer, age integer, name varchar);
create table organisation (org_id integer, city varchar, name varchar);
create TABLE log_table (log_id integer, object_id integer, table_name varchar, information json, log_date date);
我想确保log_table中的任何行都对应于单个表或组织表中的现有对象。这意味着插入
insert into log_table (object_id,table_name,information,log_date) values (13,'organisation','{"some":"interesting","information":"on the changes"}','2017-11-09');
仅当表 organization 包含ID为13的记录时,才有效。
我怎样才能在PostgreSQL中做到这一点?如果这是不可能的,那么我想我必须为个人表创建一个列,并为 log_table 中的组织表创建一个列。
答案 0 :(得分:0)
您需要entity
表:
create table entity (
entity_id serial primary key,
entity_type text check (entity_type in ('individual','organization'))
)
create table individual (
ind_id integer primary key references entity (entity_id),
age integer, name varchar
);
create table organisation (
org_id integer primary key references entity (entity_id),
city varchar, name varchar
);
create TABLE log_table (
log_id integer primary key,
entity_id integer references entity (entity_id),
information json, log_date date
);
答案 1 :(得分:0)
您也可以使用触发器来解决此问题。可以在个人和组织表上进行单独的触发器,可以在更新之前,更新之后,插入操作之后进行。
您可以在日志表中添加一列,该列对应于在基表中执行的操作,即更新或插入。
您还可以在表名和对象ID上添加唯一约束。
这最终会导致记录表中的所有可能操作,而不会更改应用程序代码。
希望这有帮助!
答案 2 :(得分:0)
从当前设计开始,您可以通过向每个实体表添加常量检查或计算/虚拟表/类型变体/标记列以及向日志添加FK(外键)(id,表)来强制执行您想要的声明。表
您有两种类型的已记录实体。谷歌sql /数据库子类型/多态/继承。或(反模式)2 /多/多个FK到2 /多个/多个表。