1

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

1 回答 1

0

两个快速点。

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

其次,在大多数表上都没有主键是在自找麻烦。在适用的情况下,我更喜欢自然主键,但如果不可能,您至少应该添加一个代理键。

于 2013-11-16T06:10:01.400 回答