我正在尝试设计一个数据库模式来保存待售/求购广告的记录。我希望能够查询,例如“过去 6 个月标题中包含此关键字的帖子的要价是多少?”
但是帖子本身可以由发布者更新和修改,所以我也希望能够提出这样的问题,“这个特定的帖子经历了哪些修订?要价如何变化?”
我对以下架构的计划是为我从帖子中获取的每个字段创建单独的表,以帖子 ID 和它们上次更新的时间作为键。我还有一张表(最后一张)显示帖子如何看待每次更新。
因此,如果有一个包含 ID、日期、价格、标题和描述的帖子,那么在 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
);
最佳答案
两个要点。
对于修订跟踪,只要您有跟踪日期和修订号,我认为您最好查看 table_log,它可用于记录以前版本的日志。
其次,在大多数表上没有主键是自找麻烦。在适用的情况下,我更喜欢自然主键,但如果不可能的话,您至少应该添加一个代理键。
关于sql - 数据库存储多字段数据的当前和编辑历史的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18813038/