我有一个要求表。
对于每个请求,有2个人扮演不同的角色,并且详细信息应完全相同。
人员详细信息显示在另一个表格中。
在每个链接到人员表的人员的请求表中放置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"