Question
What is the best practice for ensuring a Key from a "Grand-Parent" or "Great Grand-Parent" table is maintained when a "Child" or "Grand-Child" table is created from multiple relationship trees.
Details Since That Question Doesn't Likely Make Sense
I am attempting to build a database for keeping track of the execution status of automated processes running in our environment.
In general we have a "Job" which triggers one or more "Executables" and those "Executables" can run tasks for one or more customers. We will then have 2 logging tables, one that tracks when a "Job" was started, and another that will log the Success vs Failure status of each "ExecutableCustomer" instance.
A Planned Simplified Schema is below:Image may be NSFW.
Clik here to view.
When we right the record to the JobExecutableCustomerExecutionLog
, I would like to ensure that the Job.ID
value associated with JobExecutionLog.ID
value matches the Job.ID
value associated with JobExecutableCustomer.ID
.
Normally I would handle this with a Foreign Key
but since Job.ID
is not stored on JobExecutableCustomer
, JobExecutableCustomerExecutionLog
nor JobExecutionLog
. The Relationship is indirect.
Example:
I have 2 jobs, "Send Email" and "Send Text Message". "Send Email" initiates a single executable which belongs to 1 Customer. "Send Text Message" has 2 executables (both of which execute for the same customer). I want to make sure that when the record is written to JobExecutableCustomerExecutionLog
for "Send Email" the Job.ID
associated with JobExecutableCustomerExecutionLog.JobExecutableCustomerID
and JobExecutableCustomerExecutionLog.JobExecutionLogID
(after walking the relationships up) actually belong to the Job.ID
for "Send Email" not "Send Text Message".
As I see it I have 2 options:
- Push the value from
Job.ID
into all the child tables, and make it part of theForeign Key
- Have another process (
Trigger
orIndexed View
) ensure the relationships for me
I personally don't like the idea of pushing the Job.ID
value on all the other child tables, so I am leaning towards using a Trigger
or something else to handle it. I didn't know if those were my only two options or if I have the ability to configure a "normal"Foreign Key
to traverse the relationships all the way up. In some kind of Cascade
or something else.