PostgreSQL:Link 人和地址(按年份)
PostreSQL: Link people and addresses by year
我正在构建我的第一个 PostgreSQL 数据库。它涵盖了人们在过去几十年(1890 年至 1930 年)生活和工作的地方。我有人员、地址和餐厅名称表。人们搬来搬去,住所和工作场所。
我如何确定 link 从一个人到某年的地址? 换句话说,可能有 1 到 ~20 年(有些人留在原地),但我想查询每年(实际上它将成为一张地图)。
我明白了,如果只有一次,那就是外键。
我还将link将餐厅名称发送到各个地址。在某些情况下,我只有所有者的姓名,所以我将有一个 link 按年份以及他们是雇员还是所有者。接下来我会解决这个问题。也许在第一个问题得到回答后,我会找到解决这个问题的方法。
感谢您的帮助。
您需要 m:n 符合日期的关系。这通常用 "join table".
来实现
例如给定:
create table person (
person_id integer primary key,
...
);
create table address (
address_id integer primary key,
...
);
你可以这样写 table:
create table residence_period (
person_id integer references person(person_id),
address_id integer references address(address_id),
moved_in date not null,
moved_out date,
constraint moved_in_before_moved_out
check (moved_out is null or moved_in < moved_out)
);
如果您愿意,可以使用 daterange
类型而不是两个字段。
如果您想断言某人没有多个重叠住所,您可以使用 exclusion constraint。
我正在构建我的第一个 PostgreSQL 数据库。它涵盖了人们在过去几十年(1890 年至 1930 年)生活和工作的地方。我有人员、地址和餐厅名称表。人们搬来搬去,住所和工作场所。
我如何确定 link 从一个人到某年的地址? 换句话说,可能有 1 到 ~20 年(有些人留在原地),但我想查询每年(实际上它将成为一张地图)。
我明白了,如果只有一次,那就是外键。
我还将link将餐厅名称发送到各个地址。在某些情况下,我只有所有者的姓名,所以我将有一个 link 按年份以及他们是雇员还是所有者。接下来我会解决这个问题。也许在第一个问题得到回答后,我会找到解决这个问题的方法。
感谢您的帮助。
您需要 m:n 符合日期的关系。这通常用 "join table".
来实现例如给定:
create table person (
person_id integer primary key,
...
);
create table address (
address_id integer primary key,
...
);
你可以这样写 table:
create table residence_period (
person_id integer references person(person_id),
address_id integer references address(address_id),
moved_in date not null,
moved_out date,
constraint moved_in_before_moved_out
check (moved_out is null or moved_in < moved_out)
);
如果您愿意,可以使用 daterange
类型而不是两个字段。
如果您想断言某人没有多个重叠住所,您可以使用 exclusion constraint。