如何在 MongoDB 中實現具有完全完整性的不相交(非重疊)子類型?
我設計了一個實體關係圖 (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
實體的所有成員都在其中一個SPACECRAFT
或LOCATION
中,但不能同時在兩者中。作為參考,不相交的子類型定義為:
不相交的子類型,也稱為非重疊子類型,是包含超類型實體集的唯一子集的子類型;換句話說,超類型的每個實體實例只能出現在其中一個子類型中。
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 操作中的應用程序功能、其他需求等相關的資訊,並且這些因素會影響集合中文件的資料結構。