Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Database 如何以标准化数据库形式存储用户的当前工作?(我正在使用PostgreSQL)_Database_Postgresql_Database Design_Erd - Fatal编程技术网

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;阅读许多答案。反思你的研究。