sql - 数据库存储多字段数据的当前和编辑历史的模式

标签 sql postgresql

我正在尝试设计一个数据库模式来保存待售/求购广告的记录。我希望能够查询,例如“过去 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/

相关文章:

sql - 从 generate_series 获得额外的天数

sql - Rails 中同一列的 OR 条件在哪里

mysql - mysql中具有多个条件的完全外连接

postgresql - Gorm 无法连接到本地 postgres 数据库

sql - 如何在 Postgresql 中选择和更新 JSON 数组元素?

sql - 在 View 中基于相同的值创建 JSON

SQL : Error when adding column generated from other columns (postgresql 11)

sql - Oracle 日期比较

java - 我的程序中是否需要 Stmt.close()

mysql - 在 SQL 表的一个字段中插入和检索多个值