2017-05-31 46 views
0

我正在構建數據庫幫助程序和提供程序,並堅持以下方面的最佳實踐。假設我有要發送的消息,它可以具有「待處理」,「發送」,「發送」,「發送」,「失敗」的狀態,並且數據庫將跟蹤每條消息及其當前狀態。管理查找表/可重複數據/正常化數據的正確方法

我的初始佈局應該是有一個「message_status_type」表,並把所有不同的狀態放到這個表中。然後爲「消息」表創建一個外鍵來跟蹤消息的當前狀態,並基本規範化數據庫。

現在用android是這樣做的最好方法嗎?還是有沒有理由不正常化只是將message_status_type(s)作爲整數存儲在消息表中,並在提供者或合約中查找將ID轉換爲文本值?

或者是最好的做法是保留一個單獨的表,並讓提供者合併數據以抽象出具有「message_status_type」表的事實?

回答

0

首先,它看起來像你正在計劃使用數據庫作爲消息隊列:你應該谷歌和繼續前理解缺點。我之前做過這件事,它從來都不是問題,但是在高吞吐量情況下鎖定會出現問題。

我個人更喜歡使用帶有外鍵約束的單獨表格:它確保所有消息都是您期望的類型,任何人都可以在數據庫中查看並查看消息類型。我的消息類型表通常包含每種類型的描述,如果I18n不是問題,則可以將其用於顯示標籤。有成本:任何插入到消息表中都需要驗證消息類型是否滿足FKC。此外,無論何時您需要添加新的消息類型,您都需要使用新類型更新數據庫,如果您需要維護dev/prod實例,那麼這種類型的數據可能非常麻煩。

+0

我已經使用從消息表中分離出來的message_type表向前移動了。但是永遠不會有高吞吐量的情況。我希望在任何時候平均使用大約2次。也許極端情況會是20或更多。有一個線程管理消息傳遞,它將簡單地更新消息表,以便UI可以顯示傳出消息的狀態。以及提供關於傳輸的消息的傳統信息。如果l18n是一個問題,那麼會存儲一個resource_id?或字符串值來匹配資源查找? – Charon

+0

如果I18n是一個問題,那麼您可能將所有用戶可見的字符串存儲在每個語言環境的外部文件中。您只需將標識符存儲在數據庫中,除了開發人員的理解之外,沒有任何用於將字符串存儲在數據庫中的任何用法 –