2011-12-21 62 views
4

我正在研究跟蹤和處理工單/門票的應用程序。每張票都鏈接到通過級聯MySQL中的任何更改的外鍵創建/擁有票的用戶。顯然,如果用戶由於某種原因曾經刪除他們的賬戶,我們仍然希望記錄他們的門票和他們的基本信息。存儲已刪除用戶數據的最佳方法?

實現這個想法的第一種方法是在用戶表中有一列表示它們是處於活動狀態還是非活動狀態,即是否已刪除。這樣當他們關閉/刪除他們的賬戶時,他們只是翻轉這個值,然後無法訪問應用程序。

我的另一個想法是當賬戶被刪除時,將用戶記錄移到已刪除的用戶表中。通過這種方式可以將用戶表的性能保持在最佳狀態,這在增大時可能是一筆巨大的交易,但會增加額外的查詢來移動記錄。

顯然這部分可以是首選項,但我對性能方面感興趣。本質上,問題是選擇查詢與插入查詢相比如何,以及在什麼時候通過將插入查詢(將記錄移動到已刪除的用戶表)添加到混合中來提高總體性能?

回答

10

在users表中有一列表示它們是處於活動狀態還是非活動狀態,即是否已刪除。

好。

其他想法,我已經到了用戶記錄移動到已刪除用戶表

壞。您現在有兩個連接:用戶到票證和前用戶到票證。這是一個不必要的複雜性。

可能是一個巨大的交易,當它變大,

如果由「大」,你的意思是數百萬的用戶,那麼你是對的。 但是,如果「大」,你意味着成千上萬的用戶,你將無法測量太多的差異。

而且。如果您未來確實會有明顯的減速,您可以使用諸如「物化視圖」之類的內容來自動創建「活動」用戶的子集視圖/表格。

這可能是偏好的明顯部分,

不是真的。取消激活(但不刪除)用戶具有許多優點並且沒有真正的缺點。

有很多級別的活動 - 安全鎖定(但未禁用) - 暫時禁用 - 委託給其他用戶。很多很多的狀態變化。幾乎沒有刪除的理由。沒有理由「轉移到另一張桌子」。

選擇查詢如何與插入查詢進行比較,以及在什麼時候通過向插入查詢添加插入查詢(將記錄移動到刪除的用戶表)來增加整體性能?

只有你可以爲你的表,你的索引,你的服務器和你的交易組合進行測量。沒有通用的答案。

+0

我的意思是數百萬當我說大。我對「物化視圖」並不瞭解,因爲(我確信這很明顯),我不是一個真正的數據庫人員。但是,這聽起來像是我應該研究的東西。 我知道每個查詢都需要最少量的資源和時間作爲基準,並且我認爲使用它可以計算何時添加額外的查詢會對整體有利。 無論如何,很好的答案,謝謝。 – 2011-12-21 18:36:47

+0

「你可以計算何時添加額外的查詢會對整體有利」。你無法計算它。由於數據庫設計和實現的各種自由度,這幾乎是不可能的。您只能對您的設計和實施選擇進行實證研究。 – 2011-12-21 18:48:50

+0

* is_deleted *列的一個令人討厭的缺點是你不能完全使用UNIQUE鍵,除非你把NULL放在它裏面而不是TRUE。 – 2015-12-11 14:08:28

1

在我看來,標記用戶爲刪除或不是更好的方法。第二種方法,使用新表格,會引起用戶引用用戶表格的每個表格發生更改。您應該爲「已刪除的用戶表」添加新的外鍵。這將更改此表中所有選擇行的查詢。

正如您所寫,該應用程序是關於門票的,邏輯上大多數查詢將關於選擇和編輯門票。所以影響會在這張桌子上,我不認爲你對用戶有很大的疑問。

對「用戶」表進行優化並對「票據」表進行更復雜的查詢不會得到回報。

相關問題