2010-11-09 27 views
0

我正在計劃建立一些多對多的表關係。從表格中「刪除」的最佳方法是什麼?我應該將某列標記爲已刪除嗎?刪除多對多關係或狀態中的數據=不活動

Talbes

CREATE TABLE `comments`(
id INT NOT NULL, 
comment TEXT, 
status enum('active','inactive','deleted'), //Should this be added? 
PRIMARY KEY(id) 
); 

CREATE TABLE `files`(
id INT NOT NULL 
file_path VARCHAR(100), 
status enum('active','inactive','deleted'), //Should this be added? 
PRIMARY KEY (id) 
); 
CREATE TABLE `comments_files_xref`(
comment_id INT NOT NULL, 
file_id INT NOT NULL, 
PRIMARY KEY (comment_id,file_id) 
); 

我應該設置狀態欄爲無效,把我的select語句的WHERE table.status = '主動'?我應該刪除行嗎?哪種性能最好?我總是可以運行一個cron來「清理」status =「deleted」行。

+0

這實際上是一個相當複雜的問題。由於結果會不同,您使用的是哪種MySQL引擎? MyISAM,InnoDB,...? – MartinodF 2010-11-09 22:33:25

+0

我應該使用哪一個?由於外鍵約束,我喜歡InnoDB的想法,但我找不到任何描述如何調整InnoDB的好資源。 MyISAM看起來好簡單多了,或許我只是一個小菜一碟 – John 2010-11-09 23:59:40

+0

感謝您的修改!增加了一個段落。 – PerformanceDBA 2010-11-10 14:56:52

回答

1

這取決於幾件事情。你的問題並不完全清楚。根據你的意見,你在哪裏找到了IsDeleted指標,我會假設如果評論或文件被刪除,那麼你也想刪除CommentFile,聽起來很奇怪,但我會隨它去。

  1. 如果CommentFile中的行數很小,對於Comment或File中的每一行,則只需刪除它們即可。

  2. 如果它很大,那麼肯定,這是一個考慮,而IsDeleted是一個好主意。然後是的,您需要一個在後臺運行的cron作業,優先級較低,並且刪除WHERE IsDeleted = 1,批量爲1,000。

  3. 但改變每個選擇包括WHERE IsDeleted = 0,不會工作。它將進行表掃描。爲了克服這一點(使(2)中的選擇按計劃進行),您需要添加一個索引,這會降低插入和刪除的速度。所以我會完全忘記(3)並且只與(2)一起去;如果你有許多刪除,運行兩個cron作業,一個是升序,一個是降序。

  4. 更好的是,讓清理作業在無限循環中運行,每天由cron啓動一次。您可以同時運行兩個以上:將PK表範圍劃分爲no_of_jobs。監視作業和真正的在線任務,通過在循環中插入一個微小的延遲(例如1或5秒)來調整。這是我們在大型OLTP銀行系統中所做的。

0

首先,設計您的數據庫,使其與您的應用程序的需求相匹配。如果您需要簡單的「取消刪除」或「查看刪除的記錄」功能,請使用IsDeleted列並執行邏輯刪除而不是物理刪除。如果您不需要該功能,則不必擔心會從每個查詢中刪除邏輯刪除的記錄,從而不會使您的生活複雜化。

然後,如果您確定在刪除問題的周圍存在某種性能問題,那麼您可以在此時進行優化。除非你做了大量刪除或者擁有真正龐大的數據集,否則你很可能會遇到這個問題。

0

爲什麼不卸載您打算刪除到存檔表在同一數據庫或另一個倉庫分貝然後物理刪除從生產數據庫行的行?