数据库设计中深度嵌套的一对多关系

Deeply nested one to many relationships in database design

我正在设计一个基于风险分析的数据库模型 table,它类似于以下内容(对示例质量表示歉意):

基本上,用户应该能够创建这样的 tables 来通过 UI 进行风险分析。从上面的示例中,我希望可以清楚地看到可以有多个主要步骤,可以有多个子步骤,而子步骤又可以有多个风险,可以有多个措施。

可以完成这项工作的模型的快速草稿是:

RiskAnalysis:
id: number
name: string

MainStep:
id: number
description: string
risk_analysis: fk to RiskAnalysis

SubStep:
id: number
description: string
main_step: fk to MainStep

Risk:
id: number
description: string
sub_step: fk to SubStep

Measure:
id: number
description: string
risk: fk to Risk

但是,我担心的是这种设计在性能和查询方面可能很糟糕。

替代模型是:

RiskAnalysis:
id: number
name: string

RiskAnalysisEntry:
id: number
main_step: string
sub_step: string
risk: string
measure: string
risk_analysis: fk to RiskAnalysis

虽然这降低了数据库级别的复杂性,但数据的重复可能会导致应用层的复杂性增加。

此设计的一个小改进可能如下:

RiskAnalysis:
id: number
name: string

RiskAnalysisEntry:
id: number
name: string
risk_analysis: fk to RiskAnalysis
main_step: fk to MainStep
sub_step: fk to SubStep
risk: fk to Risk
measure: fk to Measure

MainStep:
id: number
description: string

SubStep:
id: number
description: string

Risk:
id: number
description: string

Measure:
id: number
description: string

这里的改进是我们只“复制”引用(外键)而不是值。

遗憾的是,我无法找出最适合我需要的解决方案。因此我的问题是:

您是否建议不要使用作为第一个选项提供的深度嵌套模型?如果是这样,处理深度嵌套数据的最优雅方法是什么?我的其他设计之一是否符合条件或是否有更好的选择可供考虑?

这是一个常见的设计模式。通常的例子是物料清单。

在你的情况下,你可以只拥有一个 table。

Step
----
Step ID
Step Name
Parent Step ID

风险分析的父步骤 ID 为空。

主要步骤将有一个指向风险分析的父步骤 ID。

以此类推,您需要多少层就有多深。