2012-05-15 16 views
6

我正在存儲目錄和文件的文件系統層次結構。同時級聯刪除數據表和搜索表

在innodb表中,我存儲每個目錄/文件的詳細信息,並使用外鍵約束來維護父子關係,該外鍵約束將在級聯刪除時進行級聯。

myisam表用於通過全文搜索來搜索這些目錄/文件。它包含每行的名稱和ID。

數據表(innodb表)中的任何行都將在搜索表(myisam表)中具有相應的行,並且必須將反映在數據表中的行添加或刪除。

我試圖找到最好的解決方案,以便在刪除父目錄時維護兩個表之間的數據一致性。 innodb表很好。我刪除父級,刪除級聯通過子級,直到它們全部被刪除。從myisam表中刪除相應的行更加困難。

我的第一個想法是在innodb表上使用on-delete觸發器。當一行被刪除時,它從myisam表中刪除相應的行。但是,由於MySQL在級聯刪除期間沒有激活觸發器(7年前的一個已知錯誤,通過提及手冊缺少支持來解決),但這不是一個選項。

我的第二個想法是把父子關係放在搜索表中,但它是一個myisam表,它支持全文搜索功能,所以它不支持外鍵約束。

我聽說innodb現在支持全文搜索,所以我想也許我可以更改搜索表引擎,但它只在實驗室版本中可用。

我最後的想法是放棄外鍵約束,只使用觸發器來保持數據的一致性。在刪除時,從innodb和myisam表中刪除parent = OLD.id。但是,爲了防止可能破壞表中所有數據的無限循環,MySQL不支持在激活觸發器的同一個表中操作數據。

我已經訴諸以編程方式通過請求循環檢索父目錄下的所有子項,但是,我覺得必須有更好的選項。 有沒有其他的工作可以提高效率?在這一點上,我能想到的唯一兩個選項是等待上述方法之一被修復或更改爲不同的RDBMS,如支持觸發級聯刪除的PostgreSQL。

任何其他的想法將不勝感激。

+0

我不知道如果我得到它,我很困惑你關於兩個表之間的關係,我得到的是你定義了兩個表之間的關係,它們具有不同的類型。如果要通過與外鍵和主鍵的用戶的表關係保持數據一致性,在所有將定義關係的表上使用innodb,那麼我以前曾嘗試過這種方法,並且在維護數據一致性時遇到了問題。 –

+0

搜索表(myisam)用作我的數據表(innodb)的搜索引擎。但是,由於我的子目錄和文件的目錄被刪除,所以這些更改需要反映在數據表和搜索表中。由於缺乏全文搜索支持(至少在當時),我無法將innodb用於搜索引擎。關係在數據表中定義的很好,但刪除不會反映在搜索表中。 – JayceTDE

+0

對於一個寫得很好的問題+1;不幸的是我沒有看到你目前的方法有任何替代方案,但也許別人會拿出一些東西 – Daan

回答

1

這些令人頭疼的事情正是讓我在可能的情況下離開mysql的原因。

...我覺得那裏一定是一個更好的選擇......

可悲的是沒有。簡單的問題是,你不能刪除級聯,並讓MySQL知道它剛刪除了什麼。因此,您唯一的選擇是在發現之前找出它要刪除的內容(這是您最後提出的算法)。

由於級聯會破壞您的數據,因此您不應使用on update cascade密鑰,以便在不刪除子級的情況下嘗試刪除父目錄將會失敗。

我會建議你創建一個程序來爲你做繁重的工作(刪除)。這將防止應用程序和數據庫之間的大IO,因爲它通過所有目錄迴避。如果您通過不同的應用程序訪問相同的數據庫(或者您只是想手動執行某些操作),我也會提供這樣做的通用代碼。

正如我先說的,我現在主要使用postgresql。這是爲什麼的一個例子。