问题
当从多个关系树创建“子”或“孙子”表时,确保维护“祖父”或“曾祖父”表中的键的最佳实践是什么。
详细信息,因为该问题可能没有意义
我正在尝试建立一个数据库来跟踪我们环境中运行的自动化进程的执行状态。
一般来说,我们有一个“作业”,它触发一个或多个“可执行文件”,这些“可执行文件”可以为一个或多个客户运行任务。然后我们将有 2 个记录表,一个跟踪“作业”何时启动,另一个记录每个“ExecutableCustomer”实例的成功与失败状态。
当我们将记录正确到 时JobExecutableCustomerExecutionLog
,我想确保与Job.ID
value 关联的值与与关联的JobExecutionLog.ID
值匹配。Job.ID
JobExecutableCustomer.ID
通常我会用 aForeign Key
但是因为Job.ID
不存储在JobExecutableCustomer
,JobExecutableCustomerExecutionLog
也不JobExecutionLog
. 关系是间接的。
例子:
我有 2 个工作,“发送电子邮件”和“发送短信”。“发送电子邮件”启动属于 1 个客户的单个可执行文件。“发送文本消息”有 2 个可执行文件(两者都为同一个客户执行)。我想确保当记录被写入JobExecutableCustomerExecutionLog
“发送电子邮件”时,Job.ID
关联JobExecutableCustomerExecutionLog.JobExecutableCustomerID
和JobExecutableCustomerExecutionLog.JobExecutionLogID
(在关系上升之后)实际上属于Job.ID
“发送电子邮件”而不是“发送短信”。
正如我所看到的,我有两个选择:
- 将值从
Job.ID
所有子表中推入,并使其成为Foreign Key
- 让另一个过程(
Trigger
或Indexed View
)为我确保关系
我个人不喜欢Job.ID
在所有其他子表上推送值的想法,所以我倾向于使用 aTrigger
或其他东西来处理它。我不知道这是否是我仅有的两个选择,或者我是否有能力配置“正常”Foreign Key
来遍历关系。在某种Cascade
或别的什么。
为什么不?显而易见的解决方案是让 JobID 成为所有子表上的前导 PK/聚集索引列。它确保通过 JobID 访问所有这些表的最佳性能。
通常,只要您有“标识关系”又名“子表”又名“弱实体”,子表应使用复合主键,其前导列也是父表的外键。像这样的东西:
如何使用
FKs
. _ 我对模型进行了一些修改,以允许可执行文件成为多个作业的一部分。假设是,当一个可执行文件运行时,它会为与该可执行文件关联的所有客户运行。您的 ERD 没有显示约束,因此涉及一些猜测。一个假设是任务写入
log_
表,因此预计会有一些冗余:比如EXE
inlog_job
; 仍然FKs
防止异常。笔记: