设计一对一关系sql的问题

时间:2019-07-07 17:03:02

标签: sql sql-server database-design

一个设备只能分配给一个雇员或车辆一次,我有两种方法建立关系,在第一种方法中,我的表EquipmentAssigned带有两个与之相关的表。这种方法在每一行中都将是一个空字段,因为设备只能分配一次。

在第二种方法中,我有两个表:EquipmentEmployee和EquipmentVehicle,在这种方法中没有空值。

根据数据库设计原则,我不知道哪种方法更适合这种情况

方法1 Approach 1

方法2 enter image description here

我无法更改“设备”表,只需要创建设备与员工和车辆之间的关系即可。

更新:

设备表仅包含有关设备的信息,该关系在EquipmentAssigned表(方法1)或[EquipmentEmployee,EquipmentVehicle]表(方法2)中。我正在寻找一种不会有null字段的方法。可以从左到右读取这些图。

3 个答案:

答案 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')
);