如何确保日志记录表中的值与其他表中的对象匹配?

时间:2017-11-09 19:49:43

标签: sql postgresql database-design foreign-keys

我有三张桌子。列出对象的两个基本表和记录数据库中的更改的第三个表。这是一个例子。

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 中的组织表创建一个列。

3 个答案:

答案 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 /多个/多个表。