有关正确数据结构的问题

时间:2019-07-03 10:11:05

标签: sql sql-server database

我有一个要求表。

对于每个请求,有2个人扮演不同的角色,并且详细信息应完全相同。

人员详细信息显示在另一个表格中。

在每个链接到人员表的人员的请求表中放置2个关键字段是否正确

还是最好将关键字段放在人员表中? (每个人只能有一个请求)

您会这样做吗?

enter image description here

或者那样

enter image description here

预先感谢

2 个答案:

答案 0 :(得分:2)

设计的典型解决方案是维护三个表。除了人员和请求表(用于存储有关人员和请求本身的数据)之外,还有第三个 junction 表,该表用于维护人员和请求之间的关系。该联结表如下所示:

person_id | request_id
1         | 1
2         | 1
3         | 2
4         | 2

使用对联结表中person_id的唯一约束,可以强制只有一个人提出一个请求。

将每个请求限制为只有两个人比较棘手,但是可以使用插入前触发器来完成。

答案 1 :(得分:0)

是的,三个桌子。

尝试这样的事情:

use tempdb

create table Person
(
   Id int primary key, 
   Name varchar(200) 
)

create table Request
(
  Id int primary key
)


create table Request_Person
(
  RequestId int not null references Request,
  PersonId int not null references Person,
  RequestRole int not null,
  constraint ck_max_two_people_per_request check (RequestRole in (1,2)),
  constraint pk_Request_Person primary key (RequestId, PersonId),
  constraint ak_Request_Person unique(PersonId),
  constraint uq_Request_RequestRole unique (RequestId,RequestRole)
)

go

insert into Request(id) values  (1),(2),(3) 

insert into Person(id,name) values (1,'Alice'),(2,'Fred'),(3,'Jo')

insert into Request_Person(RequestId,PersonId,RequestRole)
values (1,1,1),(1,2,2)

insert into Request_Person(RequestId,PersonId,RequestRole)
values (2,2,1) --Violation of UNIQUE KEY constraint 'ak_Request_Person'

insert into Request_Person(RequestId,PersonId,RequestRole)
values (1,3,3) --The INSERT statement conflicted with the CHECK constraint "ck_max_two_people_per_request"