Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库存储当前和编辑多字段数据历史的模式_Sql_Postgresql - Fatal编程技术网

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

Sql 数据库存储当前和编辑多字段数据历史的模式,sql,postgresql,Sql,Postgresql,我正在尝试设计一个数据库模式来保存销售/招聘广告的记录。我希望能够查询,例如,在过去6个月里,标题中有这个关键字的帖子的要价是多少 但是帖子本身可以通过海报进行更新和修改,所以我也想问一些问题,比如,这篇特定的帖子经过了哪些修改?要价是如何变化的 我使用下面的模式的计划是为我从帖子中获取的每个字段创建单独的表,并通过帖子id和它们上次更新的时间来键入。我还有一张表,最后一张表显示了帖子对每次更新的看法 因此,如果有一篇带有id、日期、价格、标题和描述的文章,那么在post_id、post_日期、

我正在尝试设计一个数据库模式来保存销售/招聘广告的记录。我希望能够查询,例如,在过去6个月里,标题中有这个关键字的帖子的要价是多少

但是帖子本身可以通过海报进行更新和修改,所以我也想问一些问题,比如,这篇特定的帖子经过了哪些修改?要价是如何变化的

我使用下面的模式的计划是为我从帖子中获取的每个字段创建单独的表,并通过帖子id和它们上次更新的时间来键入。我还有一张表,最后一张表显示了帖子对每次更新的看法

因此,如果有一篇带有id、日期、价格、标题和描述的文章,那么在post_id、post_日期、post_价格、post_标题和描述表中会有一个条目,在post_状态表中也会有一个条目。如果用户只更新了价格,新条目将添加到post_日期、post_价格和post_状态表中,post_状态表中的新行将显示新价格,但其他字段中的原始值

模式如下。我遇到的问题是无法创建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
);
两个要点

对于修订跟踪,只要您有一个跟踪的日期和修订号,我认为您最好查看表_log,它可以用来记录日志的早期版本


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

您至少应该将所有mod_日期时间替换为mod_日期时间戳,并使用tome区域,如果相同字段上有PK约束,则不需要唯一约束。查看缓慢变化的维度,然后,可能这个问题: