记录可变列数?

Geo*_* K. 1 normalization database-design relational-theory

我正在尝试为设备建模电缆映射。每个设备都有多个卡,每个卡都有多个端口。由于卡和端口的数量各不相同,我对如何建立正确的规范化形式和关系感到困惑,以解决具有任意数量卡的设备记录和具有任意数量端口的卡。有什么想法吗?

Han*_*non 9

这听起来像是一种非常简单的一对多关系。

对于 SQL Server,我会这样写:

CREATE TABLE Devices
(
    DeviceID INT
    , DeviceName nvarchar(255)
);

CREATE TABLE Cards
(
    CardID INT
    , CardName nvarchar(255)
    , DeviceID INT
);

CREATE TABLE Ports
(
    PortID INT
    , PortName nvarchar(255)
    , CardID INT
);


INSERT INTO Devices VALUES (1, 'Test Device 1');
INSERT INTO Devices VALUES (2, 'Test Device 2');
INSERT INTO Cards VALUES (1, 'Card 1 in Test Device 1', 1);
INSERT INTO Cards VALUES (2, 'Card 2 in Test Device 1', 1);
INSERT INTO Cards VALUES (3, 'Card 1 in Test Device 2', 2);
INSERT INTO Cards VALUES (4, 'Card 2 in Test Device 2', 2);
INSERT INTO Ports VALUES (1, 'Port in Card 1, Device 1', 1);
INSERT INTO Ports VALUES (2, 'Port in Card 2, Device 2', 4);

SELECT *
FROM Devices;

SELECT *
FROM Cards;

SELECT *
FROM Ports;
Run Code Online (Sandbox Code Playgroud)

这允许 aDevice有多个Cards,而后者又可以有多个Ports

结果:

在此处输入图片说明

这 3 个表可以这样JOINed组合在一起:

SELECT DeviceName, CardName, PortName
FROM Devices 
    INNER JOIN Cards ON Devices.DeviceID = Cards.DeviceID
    INNER JOIN Ports ON Cards.CardID = Ports.CardID
ORDER BY DeviceName, CardName, PortName;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果你LEFT JOIN像这样使用:

SELECT DeviceName, CardName, PortName
FROM Devices 
    LEFT JOIN Cards ON Devices.DeviceID = Cards.DeviceID
    LEFT JOIN Ports ON Cards.CardID = Ports.CardID
ORDER BY DeviceName, CardName, PortName;
Run Code Online (Sandbox Code Playgroud)

你会得到这些结果:

在此处输入图片说明

这是显示表关系的图像:

在此处输入图片说明

  • 显然,如果你想制作这个“网络规模”,你需要的不仅仅是这个非常简单的大纲。您可能还需要主键、外键和索引,甚至可能需要使用集群和 HADR 将这 3 个表分片到多个盒子中。 (2认同)