簡體   English   中英

如何 model 一對多關系的參照完整性,其中許多 > 0

[英]How to model referential integrity for one-to-many relationship, where many > 0

在我有 1:N 關系的情況下,我無法弄清楚如何確保數據庫級別的數據完整性,其中 N 必須至少為一個。 讓我描述一下:

我有DatasetsStored filters 存儲的過濾器可以關聯/應用於多個數據集,但總是至少一個。 當最后一個關聯的數據集被刪除時,過濾器也應該沒有懸空過濾器。 反之則不成立(當過濾器被移除時,數據集沒有變化)。 有沒有辦法 model 在 MySQL/MariaDB/PostgreSQL 等 RDBMS 中出現這種行為? 還是我注定要在代碼級別解決這個問題?

這是一個很難表示的關系。 這個問題在插入行時可能更明顯:

  • 在擁有dataset之前,您無法插入filter
  • 在數據集具有filter之前,您無法插入dataset

我的建議是您使用datasets上的on delete觸發器來管理它。 如果過濾器的最后一個數據集被刪除,則刪除關聯的過濾器。

或者,只需使用軟刪除。 使用觸發器來維護過濾器上數據集數量的計數器。 當計數器為0時,過濾器處於非活動狀態。

另一方面 -立即“沒有數據集的過濾器”是否刪除關鍵? 也許,掃描過濾器表並刪除非參考過濾器的簡單事件過程,有一段時間(例如每分鍾),就足夠了嗎? – 秋名

@Akina 並不重要,只是需要對應用程序代碼部分進行額外檢查,以確保確實存在數據集。 現在它被視為隱含的真理。 ——帕特里克·庫斯鮑赫

CREATE EVENT remove_dangling_filters
ON SCHEDULE EVERY 1 MINUTE
DO
DELETE FROM filters
WHERE NOT EXISTS ( SELECT NULL
                   FROM datasets
                   WHERE datasets.filter_id = filters.id );

如果某些過濾器沒有相關數據集(刪除了最后一個相關數據集),則該過濾器將在一分鍾內被刪除。

根據實際結構和關系調整刪除查詢。 如果需要,添加額外的邏輯(例如,將過濾器復制到存檔表、寫入日志等)。 將執行計划調整到安全期(不建議少於 5-10 秒)。

創建一次。 不需要應用程序邏輯。

不要忘記啟用Event Scheduler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM