首先,我的平臺是IBM i。這意味着我不習慣正常/通用的術語,因此可能會誤用它們。模板 - >實例化模型中的外鍵規範化問題
我建立一個數據庫設計定義'任務「工作」,這是任務的實例(一個動作模板)和。
一個任務在任務表中定義,並且將有一個主鍵TASK_ID。還有另一個表TASK_PARMS來定義任務所需參數的屬性。它有一個TASK_ID和PARM_SEQ的組合主鍵,它定義了參數的順序。 TASK_PARMS和TASKS之間將存在TASK_ID的外鍵。這些就是一個人如何執行任務的模板(有更多的屬性字段來實際定義一些動作,但它們與這個問題無關)。下面的示例表格值。
TASKS TASK_PARMS
+---------+-----------+ +---------+----------+------------+
| TASK_ID | ATTRIBUTE | | TASK_ID | PARM SEQ | ATTRIBUTES |
+---------+-----------+ +---------+----------+------------+
| FOO | PGM_A | | FOO | 10 | ALPHA10 |
+---------+-----------+ | FOO | 20 | DEC5,0 |
+---------+----------+------------+
當我想執行一個任務,我實例化一個工作。 JOBS表具有JOB_ID的主鍵,然後需要定義正在遵循哪個任務模板。所以它對TASKS的主鍵TASK_ID有一個外鍵。由於工作是由單個任務組成(概念上是一個副本),從規範化的角度來看,這似乎是正確的。
存在被用來存放實際參數值適合做這份工作一個JOB_PARMS表。當然,JOBS表有一個JOB_ID外鍵,但它也必須與TASK_PARMS中的序號具有精確的關係。
JOBS JOB_PARMS
+--------+-----------+ +---------+----------+-----------+
| JOB_ID | TASK_ID | | JOB_ID | PARM SEQ | VALUE |
+---------+----------+ +--------+----------+------------+
| 99 | FOO | | 99 | 10 | XY1000AA |
+--------+-----------+ | 99 | 20 | 2048 |
+--------+----------+------------+
這裏是我的問題。我無法將JOB_PARMS中的序列字段作爲TASK_PARMS的外鍵,因爲TASK_ID在JOB_PARMS中不存在。
這表明TASK_ID必須存在於JOB_PARMS以允許外鍵關係回到TASK_PARMS完整的複合鍵。但是,作爲一項工作實際上只是一個任務的實例化,JOB_PARMS中的TASK_ID字段將永遠不會改變JOB_ID的單個值。這似乎打破了正常化。
我感覺我在這裏錯過了一些東西。我可以將TASK_ID粘貼到JOB_PARMS文件中並繼續使用它,但是我對所有正確的感覺都想知道我哪裏會出錯。
謝謝。花了我一陣頭腦,但我現在看到的基本方法是通過擴展它的關鍵(用TaskSequenceNumber')來實例化任務,而不是替換它 - 從而保持與任務的關係完好無損。 – zkarj 2011-06-16 22:10:04
我看的時間越長,我看到的就越多。鑑於打算保持'Job_ID'的唯一性,它可能實際上是Job中鍵的第二部分。然後它就是我以前的版本,但在密鑰中包含了'Task_ID'。我認爲這正是我正常化的感覺正在下降的地方。 :-) – zkarj 2011-06-16 22:13:51