Geo*_* K. 1 normalization database-design relational-theory
我正在尝试为设备建模电缆映射。每个设备都有多个卡,每个卡都有多个端口。由于卡和端口的数量各不相同,我对如何建立正确的规范化形式和关系感到困惑,以解决具有任意数量卡的设备记录和具有任意数量端口的卡。有什么想法吗?
这听起来像是一种非常简单的一对多关系。
对于 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)
你会得到这些结果:

这是显示表关系的图像:
