Вопрос о правильной структуре данных - PullRequest
0 голосов
/ 03 июля 2019

У меня есть таблица запросов.

для каждого запроса есть 2 человека в разных ролях, связанных с ним, и детали должны быть одинаковыми.

сведения о людях появляются в другой таблице.

Правильно ли разместить 2 ключевых поля в таблице запросов для каждого человека, которые ссылаются на таблицу людей

или лучше всего разместить ключевое поле в таблице персон? (у каждого человека может быть только один запрос)

Вы бы сделали это:

enter image description here

Или вот так

enter image description here

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Типичным решением для вашего дизайна будет сохранение трех таблиц.В дополнение к таблице лиц и запросов, которая существует для хранения данных о людях и самих запросах, будет существовать третья таблица junction , которая будет поддерживать отношения между людьми и запросами.Вот как может выглядеть эта соединительная таблица:

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

Требование, чтобы только один человек имел один запрос, может быть применено с помощью уникального ограничения на person_id в соединительной таблице.

Ограничение каждого запроса только двумя людьми немного сложнее, но его можно выполнить с помощью триггера перед вставкой.

0 голосов
/ 03 июля 2019

Да, три таблицы.

Попробуйте что-то вроде этого:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...