如何更好地设计这个表?

时间:2015-07-08 12:00:33

标签: database database-design relational-database database-schema

首先,对于我无法找到更好的标题感到抱歉。

我有一个数据库,根据数量存储一些设备:

|-----------|-------------|-------------|
| device_id | device_name | device_type |
|-----------|-------------|-------------|

每种设备都有两种类型, 3端口 1端口,每个端口都有特定的名称,例如:

  • 设备1122是类型3端口,端口名称是(厨房,
    living_room,bed_room)。
  • 设备1123是类型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个字段留空。 你能帮我创造更好的设计吗?

2 个答案:

答案 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)

我在评论中粘贴答案,因此您可以将问题标记为已回答。

  

您可以将端口拆分为单独的规范化表格   deviceId,端口号和端口名称。你将有一个记录   每个设备和端口组合都带有一个外键引用   主要设备表。这将减少空字段并允许更多   如果要求改变,则超过3个端口。然而,这是在   附加表的成本和密钥的重复。从一个空间   透视你可能不会更好。然后,存储是   非常便宜,所以我不会太过分了。

Zohar的答案要完整得多,所以如果你接受他的答案我就不会有问题。但是你应该接受一个答案来结束这个问题。