网络设备和配置的数据库架构设计



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

给定四种实体类型:InterfaceDeviceVLANVNI

有以下规则:

  1. 一个Interface只有一个Device。因此,Device可能有零到多Interfaces
  2. 一个Interface可以有零到多个VLAN。一个VLAN可以有零到多个Interfaces。不能将VLAN多次分配给同一Interface
  3. 一个VLAN可以有零个或一个VNI。因此,VNI具有 0 到 许多VLANs。

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

Interface(id, device_id not null)

Device(id)

VLAN(id, vni_id nullable)

VNI(id)

InterfaceVLAN(interface_id not null, vlan_id not null) unique (interface_id, vlan_id)

但是有第四条规则:元组(VNIDeviceVLAN)必须是唯一的。

还必须能够将VLAN分配给VNI,而无需将该VLAN分配给InterfaceDevice。此外,可以将VLAN分配给Interface,而VLAN没有VNI

我坚持如何将其合并到模型中,并欢迎任何建议。

从问题:

元组(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}
<小时 />

独特(开发,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, IFC#, 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, which is mapped to vni tag VNI.
--
ifc_vln_vni {DEV, IFC#, VLN, VNI}
PK {DEV, IFC#, VLN}
AK {DEV, VLN,  VNI}
FK1 {DEV, IFC#} REFERENCES interface {DEV, IFC#}
FK2 {VLN, VNI}  REFERENCES vln_vni   {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"列作为外键,那么您可以在这两列上创建一个唯一的约束。

最新更新