Database-Design

如何在 MongoDB 中實現具有完全完整性的不相交(非重疊)子類型?

  • August 16, 2022

我設計了一個實體關係圖 (ERD),其目標是創建父實體 () 的兩個子實體 (INSTITUTION和) ,這取決於布爾屬性 ( ) 的值。在 MongoDB 中實現這一點,我想在為 false (0)時將實體連結到另一個單獨的實體,當為 true (1) 時將實體連結到另一個單獨的實體。SPACECRAFT``LOCATION``IS_SPACECRAFT``INSTITUTION``IS_SPACECRAFT``SPACECRAFT``IS_SPACECRAFT

現在,我通過在此不相關實體中創建兩個屬性 (SPACECRAFT_ID和) 並根據 的值在此屬性中INSTITUTION_ID粘貼INSTITUTION或實體的對象 ID 手動執行此操作。但這不可避免地會導致其中一個屬性為 NULL,我認為這是糟糕的數據庫設計,我想避免這種情況。考慮到這一點,有沒有辦法根據 MongoDB 中的布爾值連結另一個實體(即作為外鍵)?SPACECRAFT``IS_SPACRECRAFT

下面附上我之前提到的 ERD,因此層次結構清晰。鑑別器 (d) 旨在表示不相交(重疊)的子類型,雙線表示完全完整性約束,這樣父LOCATION實體的所有成員都在其中一個SPACECRAFTLOCATION中,但不能同時在兩者中。

在此處輸入圖像描述

作為參考,不相交的子類型定義為:

不相交的子類型,也稱為非重疊子類型,是包含超類型實體集的唯一子集的子類型;換句話說,超類型的每個實體實例只能出現在其中一個子類型中。

https://www.google.com/books/edition/Database_Systems_Design_Implementation_M/4JN4CgAAQBAJ

父實體與和實體location具有一對一的關係。MongoDB 允許儲存非規範化形式的數據。例如,您可以將資料結構化為單個集合文件,在同一文件中包含位置、航天器/機構詳細資訊。institution``spacecraft

位置

{
   _id: <ObjectId>,
   location_details: <some location specific details>,
   child_data: {
       type: <string>,   // valid values would be "spacecraft",  "ïnstitution"
       id: <number>,     // spacecraft_id or institution_id, depending upon the type
       data: {
           // specific fields depending upon the type
       }
   }
}

通常,這適用於您的案例。您可以通過對集合應用約束(或驗證)來在數據庫中強制執行此結構。您可以使用架構驗證功能創建location集合。模式驗證允許對插入和更新操作進行數據庫伺服器端驗證。可以應用的範例驗證是是帶有值或僅。此外,您可以基於. 請注意,模式驗證是一項可選功能。"child_data.type"``enum``"spacecraft"``"institution"``"child_data.type"

數據建模需要與案例、數據量、CRUD 操作中的應用程序功能、其他需求等相關的資訊,並且這些因素會影響集合中文件的資料結構。

引用自:https://dba.stackexchange.com/questions/315595