-1

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

给定四种实体类型:Interface, Device, VLAN, VNI.

有以下规则:

  1. Interface正好有一个Device。因此, aDevice可能有零到多个Interfaces
  2. AnInterface可以有零到多个VLANs。AVLAN可以有零到多个Interfaces。AVLAN不能Interface多次分配给同一个。
  3. AVLAN可以有零或一VNI。因此 aVNI有零到多个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)

但是有第四条规则:元组 ( VNI, Device, VLAN) 必须是唯一的。

还必须可以将 a 分配VLAN给 aVNI而不将VLAN其分配给 anInterface或 a Device。此外,VLAN可以将 a 分配给Interface没有 a 的VLANa VNI

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

4

2 回答 2

1

从问题:

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

从您对 James Hu 的评论:

每个 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, 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.
于 2020-10-26T18:22:56.827 回答
0

可能您可以尝试唯一约束。假设你有一个DEVICE表,它有一个DEVICE_ID列作为主键,一个“VNI_ID”列作为外键,那么你可以在这两列上创建一个唯一约束。

于 2020-10-23T14:01:11.463 回答