我正在尝试设计一个数据库架构来保留销售/想要广告的记录。我希望能够查询,例如“过去6个月中标题中包含此关键字的帖子的要价是多少?”
但是这些帖子本身可以通过海报更新和修改,所以我也希望能够提出这样的问题:“这篇特定帖子经历了哪些修改?价格如何变化?”
我对下面架构的计划是为帖子中的每个字段设置单独的表格,并按帖子ID和上次更新时间键入。我还有一个表(最后一个),显示了帖子如何查看每个更新。
因此,如果有一个包含id,date,price,title和description的帖子,post_id,post_date,post_price,post_title和description表中会有一个条目,post_state表中也会有一个条目。如果用户只更新了价格,则新条目将添加到post_date,post_price和post_states表中,post_states表中的新行将显示新价格,但其他字段中的原始值将显示。
架构如下。我得到的问题是无法创建post_states表,因为它引用的表中的字段不是唯一的。我是新手,可能是我做错了。另外,我正在使用PostgreSQL。
CREATE TABLE IF NOT EXISTS post_id (
id integer PRIMARY KEY,
url varchar
);
CREATE TABLE IF NOT EXISTS modify_date (
mod_date time,
pid integer REFERENCES post_id,
UNIQUE (mod_date, pid),
PRIMARY KEY(mod_date, pid)
);
CREATE TABLE IF NOT EXISTS post_price (
pid integer,
mod_date time,
price money,
FOREIGN KEY(mod_date, pid) references modify_date
);
CREATE TABLE IF NOT EXISTS post_title (
pid integer,
mod_date time,
title varchar,
FOREIGN KEY(mod_date, pid) references modify_date
);
CREATE TABLE IF NOT EXISTS post_location (
pid integer,
mod_date time,
location varchar,
FOREIGN KEY(mod_date, pid) references modify_date
);
CREATE TABLE IF NOT EXISTS post_email (
pid integer,
mod_date time,
email varchar,
FOREIGN KEY(mod_date, pid) references modify_date
);
CREATE TABLE IF NOT EXISTS post_description (
pid integer,
mod_date time,
description varchar,
FOREIGN KEY(mod_date, pid) references modify_date
);
CREATE TABLE IF NOT EXISTS post_state (
pid integer,
mod_date time,
title varchar REFERENCES post_title(title),
description varchar REFERENCES post_description(description),
price money REFERENCES post_price(price),
location varchar REFERENCES post_location(price),
email varchar REFERENCES post_email(email),
url varchar REFERENCES post_id(url),
FOREIGN KEY(mod_date, pid) references modify_date
);
答案 0 :(得分:0)
两个快速点。
对于修订跟踪,只要您有跟踪日期和修订号,我认为您最好查看table_log,它可用于记录以前版本的日志。
其次,在大多数桌子上没有主键是在路上遇到麻烦。我更喜欢适用的自然主键,但如果不可能,你至少应该添加一个代理键。