网络设备的数据库架构设计和配置 唯一DEV,VNI唯一DEV,VLN,VNI

问题描述

我有以下数据库设计问题:

给出四种实体类型:this.a = _.uniqBy(a,'id'); InterfaceDeviceVLAN

有以下规则:

  1. 一个VNI恰好有一个Interface。因此,Device可能有零到许多Device
  2. 一个Interfaces可以有零个到多个InterfaceVLAN可以有零个到多个VLANInterfaces不能多次分配给同一VLAN
  3. 一个Interface可以有零个或一个VLAN。因此,VNI的个数为VNI到零。

到目前为止,这很容易,它可以像这样建模:

VLAN

Interface(id,device_id not null)

Device(id)

VLAN(id,vni_id nullable)

VNI(id)

但是有第4条规则:元组InterfaceVLAN(interface_id not null,vlan_id not null) unique (interface_id,vlan_id)VNIDevice)必须是唯一的。

还必须能够将VLAN分配给VLAN,而不能将VNI分配给VLANInterface。另外,Device可以分配给VLAN,而Interface却没有VLAN

我一直坚持将其整合到模型中,并欢迎提出任何建议。

解决方法

从问题开始:

元组(VNI,Device,VLAN)必须是唯一的。

从您对詹姆斯·胡的评论:

每个VNI在每个设备上最多只能映射到一个VLAN。

这是两个不同的约束。第二个意味着(Device,VNI)是唯一的,它意味着第一个,但并非相反。


-- Vni tag VNI exists.
--
vni_tag {VNI}
     PK {VNI}


-- Virtual lan (vlan) VLN exists.
--
vlan {VLN}
  PK {VLN}
  • 每个vlan最多映射到一个 vni标签; 对于每个vni标签,该标签 可能会映射到多个 vlan。
-- Vlan VLN is mapped to vni tag VNI.
--
vln_vni {VLN,VNI}
     PK {VLN}
     SK {VLN,VNI}

FK1 {VLN} REFERENCES vlan    {VLN}
FK2 {VNI} REFERENCES vni_tag {VNI}
  • 每个设备 可能具有多个 接口;
    对于每个接口:该接口完全属于一个设备。
-- Device DEV exists.
--
device {DEV}
    PK {DEV}


-- Interface number IFC# of device DEV exists.
--
interface {DEV,IFC#}
       PK {DEV,IFC#}

FK {DEV} REFERENCES device {DEV}

唯一(DEV,VNI)

对于第二个约束,(DEV,VNI)唯一:

  • 每个接口 可以连接到多个 vlan; 对于每个VLAN,一个以上接口 可以连接到该VLAN。

  • 对于设备和vni标签的每种组合,设备和标签的组合最多可以出现一次。

-- Interface number IFC# of device DEV is connected to
-- vlan VLN,which is mapped to vni tag VNI.
--
ifc_vln_vni {DEV,IFC#,VLN,VNI}
         PK {DEV,VLN}
         AK {DEV,VNI}

FK1 {DEV,IFC#} REFERENCES interface {DEV,IFC#}
FK2 {VLN,VNI}  REFERENCES vln_vni   {VLN,VNI}

唯一(DEV,VLN,VNI)

在第一个约束的情况下,(DEV,VLN,VNI)唯一:

  • 每个接口 可以连接到多个 vlan; 对于每个VLAN,一个以上接口 可以连接到该VLAN。

  • 对于设备,vlan和vni标签的每种组合,该设备,vlan和标签的组合最多可以出现一次。

-- Interface number IFC# of device DEV is connected to
-- vlan VLN,VNI}

注意:

All attributes (columns) NOT NULL

PK = Primary Key
SK = Proper Superkey (Unique)
AK = Alternate Key   (Unique)
FK = Foreign Key
Using suffix # to save on screen space.
OK for SQL Server and Oracle,for others use _NO.
For example,rename IFC# to IFC_NO.
,

可能您可以尝试使用唯一约束。假设您有一个DEVICE表,该表具有一个DEVICE_ID列作为主键,而一个'VNI_ID`列作为外键,则只需在这两列上创建唯一约束。