[英]How to model referential integrity for one-to-many relationship, where many > 0
在我有 1:N 關系的情況下,我無法弄清楚如何確保數據庫級別的數據完整性,其中 N 必須至少為一個。 讓我描述一下:
我有Datasets
和Stored 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.