时间范围内的“一对多”关系完整性问题

问题描述 投票:1回答:2

假设我有这样的表:

CREATE TABLE foo (
  id SERIAL PRIMARY KEY
  , barid integer NOT NULL REFERENCES bar(id) 
  , bazid integer NOT NULL REFERENCES baz(id)
  , startdate timestamp(0) NOT NULL
  , enddate timestamp(0) NOT NULL
);

该表的目的是在表bar和baz之间提供伪的“一对多”关系,但是该关系可以随时间变化:

SELECT * FROM bar
JOIN foo on TRUE
  AND foo.barid = bar.id
  AND now() BETWEEN foo.startdate  AND foo.enddate 
JOIN baz on baz.id = foo.bazid

我们可以想象,对于bar表中的某一行,我们想在baz表中找到对应的行,但是对应的行在不同的时间段可能有所不同-因此,它现在应该返回不同的行,上个月有所不同,等等。

现在我的问题是:验证此表中数据完整性的最佳方法是什么?具体来说,我需要确保,在特定的时间戳记下,foo的表foo.barid中将只有一行。我知道我可以编写一个触发器(到目前为止,这似乎是我的唯一选择),但是也许有人有一个更简单的主意?我当时在考虑使用某种部分索引,但不确定如何编写条件...

postgresql database-design constraints date-range partial-index
2个回答
1
投票

我需要确定,对于特定的时间戳记,foo的表foo.barid中将只有一行


0
投票

由于我切换到postgres 9.3的工作被推迟,所以我最终得到了与您提到的帖子类似的内容:

© www.soinside.com 2019 - 2024. All rights reserved.