【问题标题】:How to design this tables better?如何更好地设计这张桌子?
【发布时间】:2015-07-08 12:00:33
【问题描述】:

首先,对不起,我找不到更好的标题。

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

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

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

  • 设备 1122 是 3 端口类型,端口名称是(厨房,
    客厅、卧室)。
  • 设备 1123 是类型 1 端口,端口名称是 (boiler)。

我的想象设计是:

|-----------|-------------|--------|-----------|--------|
+ 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-port 的设备,我会将 200 个字段留空。 你能帮我创造更好的设计吗?

【问题讨论】:

  • 您可以使用 deviceId、端口号和端口名称将端口拆分为单独的规范化表。对于每个设备和端口组合,您将拥有一条记录,外键引用返回到主设备表。如果需求发生变化,这将减少空字段并允许超过 3 个端口。然而,这是以额外的表和密钥重复为代价的。从空间的角度来看,你最终可能不会好得多。再说一次,存储很便宜,所以我不会花太多钱。
  • @BJSafdie:谢谢,我认为它比我的解决方案更好,因为它减少了一些空间并且更具学术性。

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


【解决方案1】:

我将粘贴我的评论作为答案,以便您可以将问题标记为已回答。

您可以使用以下命令将端口拆分为单独的规范化表 deviceId、端口号和端口名称。您将拥有一份记录 每个设备和端口组合都带有一个外键引用返回 主要设备表。这将减少空字段并允许更多 如果要求发生变化,则超过 3 个端口。然而,这是在 额外表和密钥重复的成本。从一个空间 从你的角度来看,你最终可能不会好得多。再说一次,存储是 相当便宜,所以我不会流汗太多。

Zohar 的回答要完整得多,所以如果您接受他的回答,我不会有任何问题。但是,您应该接受答案以结束问题。

【讨论】:

  • 我会接受这个答案,因为它更简单。谢谢 BJ。
【解决方案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)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2013-12-11
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多