0

在我的應用程序中,我創建了一個有主管的案例,但由於主管可以是員工或外部主管,因此我希望能夠保存內部引用的員工ID或外部主管人員姓名的字符串。具有外鍵或字符串時的數據庫設計

我該如何實施?有一個表「案例」和子表「case_internal_sv」和「case_external_sv」的路要走嗎?

+0

外部監事和內部監事是否是專職監督人的子類? –

回答

0

您的問題中沒有很多信息是基於哪個答案。

如果在所有類型的主管人員之間有共同的數據和功能,那麼您可能需要一張表來存放這些常用數據。該表將爲主管人員建立主鍵值,並且案例表將在該表中具有外鍵。獨立於內部或外部監督人員的信息將進入單獨的表格,並且這些表格還會將外部關鍵字返回到常見監督員級別數據。

這種設計比較好,因爲您只需要一個地方就可以找到所有主管的列表,因爲您可以直接在數據庫中執行主管/案例關係,而無需大量代碼或附加約束來確保兩列中的「僅一個」被填充。

從數據庫的角度來看,我認爲即使內部和外部監管人員的數據完全不相交(這不太可能),我也會考慮使用此設計。

+0

這正是我正在尋找的,謝謝! – TheCokeGuy

0

如果您的數據庫允許您定義多個主鍵,那麼您可以將字段員工和字段employee_type組合以形成唯一主鍵。如果沒有,您可以爲該表創建一個自動生成的主鍵,並且有一個僱員類型字段和一個employee_id字段。

您使用的數據庫是?

+0

我使用的是PostgreSQL – TheCokeGuy

0

表格過於規範可能會造成更多的傷害而不是幫助。您應該根據您的要求評估子表的優點/缺點。

一個簡單的解決方案可以是在'case'表中有一個'sv_type'列。並有兩列

  • 'internal_sv_id',可爲空的外鍵employee表
  • 'external_sv_name',可爲空字符串保存外部名。

然後檢查監督員的基礎上,'sv_type'

這兩列這樣的設計可能不完全符合第三範式之一,但昂貴的加入可以節省很多,允許與員工表的完整性。

對於我來說,如果有疑問,我會尋求最簡單的解決方案。

+0

這就是我的想法。正在考慮如你所描述的那樣製作這兩個字段並使它們爲空。然後,也許可能創建一個約束來要求填充。 – TheCokeGuy

+0

這種設計並不簡單,並且確保完整性非常困難 - 不能簡單地使用主鍵和外鍵來完成,並且需要額外的代碼來約束兩列中的值。考慮到世界上不可能有那麼多管理者,所涉及的JOIN不太可能是昂貴的,尤其是當考慮到建立用戶界面和在可能的多個客戶端上執行完整性的額外成本時。 –