一个设备只能分配给一个雇员或车辆一次,我有两种方法建立关系,在第一种方法中,我的表EquipmentAssigned带有两个与之相关的表。这种方法在每一行中都将是一个空字段,因为设备只能分配一次。
在第二种方法中,我有两个表:EquipmentEmployee和EquipmentVehicle,在这种方法中没有空值。
根据数据库设计原则,我不知道哪种方法更适合这种情况
我无法更改“设备”表,只需要创建设备与员工和车辆之间的关系即可。
更新:
设备表仅包含有关设备的信息,该关系在EquipmentAssigned表(方法1)或[EquipmentEmployee,EquipmentVehicle]表(方法2)中。我正在寻找一种不会有null字段的方法。可以从左到右读取这些图。
答案 0 :(得分:0)
请提供更多信息:在“设备”表中,这些字段的含义是什么?
Id:设备的唯一标识符
代码=您在这里有Vehicle.Code或Employee.Unitid吗?
设备类型:(我想是车辆还是雇员?)
在这种情况下,适当的解决方案是使用表EquipmentType包含字段:
Id:员工1个,车辆2个
标签:员工,车辆
然后在设备表中,您有: (我将使用记号:TableName.FieldName)
Equipment.EquipmentType = EquipmentType.Id(即1或2)
Equipment.Code = Vehicle.Code或Employee.Unitid
致谢。
答案 1 :(得分:0)
我建议您有一个称为“设备分配”的对照表
它看起来像这样
Create Table EquipmentAssignment(
EquipmentId int not null
AssignedId int not null
AssignedType varchar(10) not null
)
AssignedType将是'Vehicle'或'Employee'(或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
答案 2 :(得分:0)
我不知道为什么需要任何中间表,因为您指定最多有一个分配。有两个更好的选择将引用直接放在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')
);