首先,对于我无法找到更好的标题感到抱歉。
我有一个数据库,根据数量存储一些设备:
|-----------|-------------|-------------|
| device_id | device_name | device_type |
|-----------|-------------|-------------|
每种设备都有两种类型, 3端口和 1端口,每个端口都有特定的名称,例如:
我的想象力设计是:
|-----------|-------------|--------|-----------|--------|
+ device_id | device_name | port_1 | port_2 | port_3 +
|-----------|-------------|--------|-----------|--------|
| 1122 | First floor | kitchen|living_room|bed_room|
|-----------|-------------|--------|-----------|--------|
| 1123 | Second floor| boiler | null | null |
|-----------|-------------|--------|-----------|--------|
但是我的设计并不好,因为如果我有100个 1端口类型的设备我将200个字段留空。 你能帮我创造更好的设计吗?
答案 0 :(得分:2)
完全规范化的架构将具有设备类型表(您可以在其中指定每种设备类型的端口数),
具有唯一设备名称和设备ID的设备表,
具有唯一端口名称和唯一端口ID的端口表,
以及具有设备ID和端口ID的交集表,其中这两列的组合是主键
您应该考虑在向交集表添加记录时添加检查约束,以确保您不会根据设备类型添加太多记录(如果目标数据库支持检查约束)。
以下是此架构的伪代码:
TblDeviceType
(
DeviceType_Id int, -- primary key
DeviceType_Name varchar(20) -- unique
)
TblDevice
(
Device_Id int, -- primary key
Device_Type int, -- fk to TblDeviceType
)
TblPorts
(
Port_Id int, -- primary key
Port_Name varchar(30) -- unique
)
TblDeviceToPort
(
DeviceToPort_Device int, -- fk to TblDevice
DeviceToPort_Port int, -- fk to TblPort
Primary key (DeviceToPort_Device, DeviceToPort_Port)
)
答案 1 :(得分:2)
我在评论中粘贴答案,因此您可以将问题标记为已回答。
Zohar的答案要完整得多,所以如果你接受他的答案我就不会有问题。但是你应该接受一个答案来结束这个问题。您可以将端口拆分为单独的规范化表格 deviceId,端口号和端口名称。你将有一个记录 每个设备和端口组合都带有一个外键引用 主要设备表。这将减少空字段并允许更多 如果要求改变,则超过3个端口。然而,这是在 附加表的成本和密钥的重复。从一个空间 透视你可能不会更好。然后,存储是 非常便宜,所以我不会太过分了。