线性数据库设计
Linear database design
我有一个关于数据库关系的问题
我正在尝试构建一个具有以下规则的监控系统:
Channels
属于一个Sensor
Sensors
属于一个Device
Devices
属于一个Probe
Probes
属于一个Core
这是表格的预览
+-------------+ +-------------+
| Cores | | Probes |
+-------------+ +-------------+
| id | | id |
| fields ... | | fields ... |
+-------------+ | core_id |
+-------------+
+-------------+ +-------------+ +-------------+
| Devices | | Sensors | | Channels |
+-------------+ +-------------+ +-------------+
| id | | id | | id |
| fields ... | | fields ... | | fields ... |
| probe_id | | device_id | | sensor_id |
+-------------+ +-------------+ +-------------+
现在要获取特定 channel
的 core_id
或 core
的 channels
的完整列表,我需要连接所有五个表。
我的问题是,像下面的示例那样将所有表链接在一起会更好吗?还是糟糕的数据库设计。
- 核心(id,字段...)
- 探测器(id,字段...,core_id)
- 设备(id,字段...,core_id,probe_id)
- 传感器(id,字段...,core_id,probe_id,device_id)
- 频道(id, 字段..., core_id, probe_id, device_id, sensor_id)
重复额外的外键是非规范化的,会给您带来麻烦。
它应该是这样的:
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
我有一个关于数据库关系的问题
我正在尝试构建一个具有以下规则的监控系统:
Channels
属于一个Sensor
Sensors
属于一个Device
Devices
属于一个Probe
Probes
属于一个Core
这是表格的预览
+-------------+ +-------------+
| Cores | | Probes |
+-------------+ +-------------+
| id | | id |
| fields ... | | fields ... |
+-------------+ | core_id |
+-------------+
+-------------+ +-------------+ +-------------+
| Devices | | Sensors | | Channels |
+-------------+ +-------------+ +-------------+
| id | | id | | id |
| fields ... | | fields ... | | fields ... |
| probe_id | | device_id | | sensor_id |
+-------------+ +-------------+ +-------------+
现在要获取特定 channel
的 core_id
或 core
的 channels
的完整列表,我需要连接所有五个表。
我的问题是,像下面的示例那样将所有表链接在一起会更好吗?还是糟糕的数据库设计。
- 核心(id,字段...)
- 探测器(id,字段...,core_id)
- 设备(id,字段...,core_id,probe_id)
- 传感器(id,字段...,core_id,probe_id,device_id)
- 频道(id, 字段..., core_id, probe_id, device_id, sensor_id)
重复额外的外键是非规范化的,会给您带来麻烦。
它应该是这样的:
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