我有一个简单的结构,我不确定如何处理弹出的一些问题。
有 4 个表:Reports
, ReportParameters
, ScheduledReports
, ScheduledReportParameters
。
ReportParameters
列出报告所需的参数。
ScheduledReports
是报表的预定实例。(以周四报 X 运行为例)。
ScheduledReportParameters
是此实例运行时要使用的参数及其值的列表。
基本布局:
Reports:
ReportID (PK)
ReportParameters:
ReportParameterID (PK)
ReportID (FK to Reports)
Name
ScheduledReports:
ScheduledReportID (PK)
ReportID (FK to reports)
ScheduledReportParameters:
ScheduledReportID (FK to ScheduledReports)
ReportParameterID (FK to ReportParameters)
Value
(PK is formed by the ScheduledReportID and ReportParameterID)
这有一个问题,即与计划报告关联的参数不必与基础报告的实际预期一致,它可能是完全不同的基础报告,而不是计划报告所基于的报告。
所以,我想我可以将 the 添加ReportID
到 the ScheduledReportParameters
,但这无济于事,因为没有任何强制要求ReportID
there 同意 there 的ScheduledReport
基础。
我错过了一些简单的东西吗?或者,这比我想象的更棘手吗?
有一个计划的报告,其中的参数实际上并不与报告一起使用,这对我来说没什么大不了的,因为当我提取它们时,连接会自动过滤掉任何潜在的坏数据,但我想防止坏数据进入第一名。我知道我可以使用触发器来做到这一点,但这很快就会变得丑陋。
看起来您不知道外键可以基于多个列。
所以,是的,添加一列并将
ReportID
其ScheduledReportParameters
包含在两个外键中以强制执行约束。两个字段之间
ScheduledReportParameters
和使用一个外键。ScheduledReports
(ScheduledReportID, ReportID)
ScheduledReportParameters
两个字段之间和ReportParameters
使用两个字段之间的第二个外键(ReportParameterID, ReportID)
。完整脚本
报告
报告参数
预定报告
预定报告参数
外键使用的两列必须有唯一索引。我在这个例子中添加了明确的索引(
IX_ReportParameterID_ReportID
和IX_ScheduledReportID_ReportID
)。您还可以将第二列添加到相应表的主键中。样本数据
测试约束
为报表 1 添加参数值:
尝试为不属于报表的参数添加值(参数 3 属于报表 2,而不是 1:
尝试为错误的计划报告添加参数值(参数 3 属于报告 2,计划 1 不用于报告 2):
缺少参数值
请注意,此模式不会阻止参数的缺失值。例如,您可以删除值
V2
:因此,现在 schedule
S1
仅具有 parameterP1
的值,而没有 parameter 的值P2
。