db用于存储当前和编辑多字段数据历史的模式

时间:2013-09-15 13:38:10

标签: sql postgresql

我正在尝试设计一个数据库架构来保留销售/想要广告的记录。我希望能够查询,例如“过去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
);

1 个答案:

答案 0 :(得分:0)

两个快速点。

对于修订跟踪,只要您有跟踪日期和修订号,我认为您最好查看table_log,它可用于记录以前版本的日志。

其次,在大多数桌子上没有主键是在路上遇到麻烦。我更喜欢适用的自然主键,但如果不可能,你至少应该添加一个代理键。

相关问题