Database 如何以标准化数据库形式存储用户的当前工作?(我正在使用PostgreSQL)
我有一个Database 如何以标准化数据库形式存储用户的当前工作?(我正在使用PostgreSQL),database,postgresql,database-design,erd,Database,Postgresql,Database Design,Erd,我有一个USERS表和一个EMPLOYMENT表,它将多个雇员链接到单个用户。我如何为用户存储当前雇用,并限制他们可能没有当前雇用,而且他们只能有一个当前雇用 就业表中的一个字段是否是当前的字段,因为默认情况下,该字段对当前只有一个就业没有限制 我考虑的另一个首选方案是使用一个USER\u CURRENT\u EMPLOYMENT表将用户链接到一份工作,但是我需要什么约束条件才能使其工作 如前所述,我正在使用postgresql,但更好奇的是,无论使用何种语言,这种关系应该如何运作。使用唯一索引
USERS
表和一个EMPLOYMENT
表,它将多个雇员链接到单个用户。我如何为用户存储当前雇用,并限制他们可能没有当前雇用,而且他们只能有一个当前雇用
就业表中的一个字段是否是当前的
字段,因为默认情况下,该字段对当前只有一个就业没有限制
我考虑的另一个首选方案是使用一个USER\u CURRENT\u EMPLOYMENT
表将用户链接到一份工作,但是我需要什么约束条件才能使其工作
如前所述,我正在使用postgresql,但更好奇的是,无论使用何种语言,这种关系应该如何运作。使用唯一索引和where谓词来强制用户及其工作最后一天的唯一性(可为空)。这将确保每个用户在最后一天只有一行具有空值 “创建唯一索引idx_当前雇主(用户id,(最后一天为空))其中最后一天为空;” 下面是一个完整的脚本来说明如何使用它:
drop table if exists users;
drop table if exists employment;
create table users
(user_id int not null primary key,
user_name varchar(30) not null)
;
create table employment
(id SERIAL PRIMARY KEY,
user_id int not null,
employer_id int not null,
last_day date null)
;
--insert joe and his previous 2 employers
insert into users
values(1,'Joe');
insert into employment (user_id, employer_id, last_day)
values(1,1,'20150831');
insert into employment (user_id, employer_id, last_day)
values(1,2,'20200831');
--unique index
create unique index idx_current_employer on employment (user_id, (last_day IS NULL)) WHERE last_day IS NULL;
--insert Joe's current employer (null last day)
insert into employment (user_id, employer_id, last_day)
values(1,3,null);
--this one fails - can't insert another employer with null last day
insert into employment (user_id, employer_id, last_day)
values(1,6,null);
--set last day of previous employer first
update employment
set last_day = '20201006'
where user_id = 1
and last_day is null
;
--now insert succeeds
insert into employment (user_id, employer_id, last_day)
values(1,6,null);
--list all employment
select user_id, employer_id, last_day, case when last_day is null then True else False end as is_current
from employment
order by 1, 4 desc, 3 desc
;
在
employment
表中,您是否有关于用户何时接受和离职的信息?如果是,您已经有足够的信息来获得当前工作。是的,那么我将使用结束日期作为null
来表示当前工作?这也不能解决如何确保一次只能将一条记录设置为null的问题。请遵循已出版的关于信息建模、关系模型与关系与非关系数据库设计、查询与DBMS的学术教科书。(记录和使用设计的语言和工具手册不属于此类教科书。)(维基文章或网络帖子也不属于此类教科书。)问1个具体问题。这是一个常见问题。在考虑发帖之前,请先阅读您的课本和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。反思你的研究。