Проблема с проектированием отношений один к одному sql - PullRequest
0 голосов
/ 07 июля 2019

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

Во втором подходе у меня есть две таблицы: EquipmentEmployee и EquipmentVehicle, в этом подходе нет нулевых значений.

Я не знаю, какой подход лучше подходит для этого случая в соответствии с принципами проектирования базы данных

Подход 1 Approach 1

Подход 2 enter image description here

Я не могу изменить таблицу «Оборудование», мне просто нужно создать отношения между оборудованием, сотрудниками и транспортными средствами.

Обновление:

ОборудованиеТаблица просто содержит информацию об оборудовании, связь находится в таблице EquipmentAssigned (подход 1) или в таблицах [EquipmentEmployee, EquipmentVehicle] (подход 2).Я ищу подход, где будет не пустое поле.Диаграммы можно читать слева направо.

Ответы [ 3 ]

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

Я хотел бы предложить вам таблицу перекрестных ссылок под названием EquipmentAssignment

, это будет выглядеть так

Create Table EquipmentAssignment(
EquipmentId int not null 
AssignedId   int  not null
AssignedType  varchar(10) not null
) 

AssignedType будет либо «Автомобиль», либо «Сотрудник» (или V / Eчто угодно ...)

Я использовал этот шаблон для большого успеха, имея дело с подобной ситуацией.

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

create View Assignees
as
;with assignees as (
Select Name [AssigneeName], Id [AssigneeId], convert(varchar(10),'Employee') as [AssigneeType] from Employee
union 
Select Name, Id, convert(varchar(10),'Vehiclle') as [AssigneeType] from Vehicle
)

select  e.*, a.* 
from EquipmentAssignment ea 
join assignees a  on ea.AssigneeId = a.AssigneeId and ea.AssigneeType = a.AssigneeType
0 голосов
/ 07 июля 2019

Я не понимаю, зачем вам нужны какие-либо промежуточные таблицы, потому что вы указываете, что существует не более одного назначения.Два лучших варианта помещают ссылку непосредственно в Equipment.

. Первый позволяет легко определить отношения с внешним ключом:

create table Equipment (
    EquipmentId int identity primary key,
    . . . ,
    EmployeeId int references employees(EmployeeId),
    VehicleId int references vehicles(VehicleId),
    check (employeeId is null or vehicleId is null)
);

Второй не дает:

create table Equipment (
    EquipmentId int identity primary key,
    . . . ,
    ReferenceId int references employees(EmployeeId),
    ReferenceType varchar(10),
    check (ReferenceType in ('Employee', 'Vehicle')
);
0 голосов
/ 07 июля 2019

Пожалуйста, предоставьте больше информации: Каково значение полей в таблице «Оборудование»?

Id: Уникальный идентификатор оборудования

Код = У вас есть здесь Vehicle.Code или Employee.Unitid?

Тип оборудования: (я полагаю, автомобиль или работник?)

В этом случае правильным решением было бы иметь таблицу EquipmentType с полями:

Id: 1 для сотрудника, 2 для автомобиля
Метка: работник, автомобиль

Тогда в таблице Equipment, у вас есть: (Я буду использовать обозначение: TableName.FieldName)

Equipment.EquipmentType = EquipmentType.Id (т.е. 1 или 2)

Equipment.Code = Vehicle.Code или Employee.Unitid

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...