线性数据库设计

Linear database design

我有一个关于数据库关系的问题

我正在尝试构建一个具有以下规则的监控系统:

这是表格的预览

+-------------+    +-------------+
| Cores       |    | Probes      |
+-------------+    +-------------+
| id          |    | id          |
| fields ...  |    | fields ...  |
+-------------+    | core_id     |
                   +-------------+

+-------------+    +-------------+    +-------------+
| Devices     |    | Sensors     |    | Channels    |
+-------------+    +-------------+    +-------------+
| id          |    | id          |    | id          |
| fields ...  |    | fields ...  |    | fields ...  |
| probe_id    |    | device_id   |    | sensor_id   |
+-------------+    +-------------+    +-------------+

现在要获取特定 channelcore_idcorechannels 的完整列表,我需要连接所有五个表。

我的问题是,像下面的示例那样将所有表链接在一起会更好吗?还是糟糕的数据库设计。

重复额外的外键是非规范化的,会给您带来麻烦。

它应该是这样的:

Cores(id, fields...)
Probes(id, fields..., core_id)
Devices(id, fields..., probe_id)
Sensors(id, fields..., device_id)
Channels(id, fields..., sensor_id)

还有——风格点。您的 table 名称应该是单数 - 定义一行内容。所以 Core、Probe、Device 等

需要考虑的一件事是:“ X 可以脱离 Y 的上下文吗?”。根据答案更改设计。根据您的问题和设计,这些是答案:

|            Question                 |Answer|
+-------------------------------------+------+
|Can a core exist independently?      | Yes  |
|Can a probe exist without a core?    | No   |
|Can a device exist without a probe?  | No   |
|Can a sensor exist without a device? | No   |
|Can a channel exist without a sensor?| No   |

根据这些答案,可行的逻辑设计可能是:

-- Core COR exists.
--
core {COR}
  PK {COR}
-- Probe number PRO_NO of core COR exists.
--
probe {COR, PRO_NO}
   PK {COR, PRO_NO}

FK {COR} REFERENCES core {COR}
-- Device number DEV_NO of probe number PRO_NO
-- of core COR exists.
--
device {COR, PRO_NO, DEV_NO}
    PK {COR, PRO_NO, DEV_NO}

   FK {COR, PRO_NO} REFERENCES
probe {COR, PRO_NO}
-- Sensor number SNS_NO of device number DEV_NO,
-- of probe number PRO_NO, of core COR exists.
--
sensor {COR, PRO_NO, DEV_NO, SNS_NO}
    PK {COR, PRO_NO, DEV_NO, SNS_NO}

    FK {COR, PRO_NO, DEV_NO} REFERENCES
device {COR, PRO_NO, DEV_NO}
-- Channel CHN_NO of sensor number SNS_NO,
-- of device number DEV_NO, of probe number PRO_NO,
-- of core COR exists.
--
channel {COR, PRO_NO, DEV_NO, SNS_NO, CHN_NO}
     PK {COR, PRO_NO, DEV_NO, SNS_NO, CHN_NO}

    FK {COR, PRO_NO, DEV_NO, SNS_NO} REFERENCES
sensor {COR, PRO_NO, DEV_NO, SNS_NO}
  • 这是一个糟糕的设计吗? 没有.
  • 逻辑合理吗? .
  • 规范化呢? 5NF(具有...属性).
  • 物理实现是否可行? 是的,也许,不,取决于

您正在考虑物理设计并且关注键的宽度和索引大小。在这一点上,您决定遵循自然层次结构并为每个实体使用一个列标识符,即使它不能脱离另一个实体的上下文而存在。

-- Core COR exists.
--
core {COR}
  PK {COR}
-- Probe PRO of core COR exists.
--
probe {PRO, COR}
   PK {PRO}

   FK {COR} REFERENCES core {COR}
-- Device DEV of probe PRO exists.
--
device {DEV, PRO}
    PK {DEV}

    FK {PRO} REFERENCES probe {PRO}
-- Sensor SNS of device DEV exists.
--
sensor {SNS, DEV}
    PK {SNS}

    FK {DEV} REFERENCES device {DEV}
-- Channel CHN of sensor SNS, exists.
--
channel {CHN, SNS}
     PK {CHN}

     FK {SNS} REFERENCES sensor {SNS}

这个符合您的初始设计。

  • 这是一个糟糕的设计吗? 没有.
  • 逻辑合理吗? .
  • 规范化呢? 5NF(具有...属性).
  • 这样更好吗? 是的,也许,不,取决于

确保您不允许 NULLs。允许 NULLs 用于 FKs 基本上可以回答 "yes" 所有“ 可以 X 存在而没有 Y 吗?” 的问题,并导致完全不同的设计(架构)。


注:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key