数据库设计中深度嵌套的一对多关系
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。
以此类推,您需要多少层就有多深。
我正在设计一个基于风险分析的数据库模型 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。
以此类推,您需要多少层就有多深。