2009-07-17 74 views
8

假設您正在創建一個數據庫來存儲聊天室應用程序的消息。有無數的聊天室(它們是在運行時按需創建的),並且所有消息都需要存儲在數據庫中。數據庫設計 - 一張表中有數十億條記錄?

如果知道最終可能在該表中有數十億條記錄,是否會創建一個巨型表來存儲所有聊天室的消息是錯誤的?

難道是更爲謹慎的動態製作創建的每個房間表,只存儲在該表中房間的消息?

+1

你可能想闡述一下您的使用情況。高寫入?什麼類型的讀取?鑑於沒有其他信息,一個表是「最正確的」。但是,在現實世界中的表現是完全不同的問題。而且你還沒有提供任何有關人們準確回答的信息。 – 2009-07-17 21:27:02

回答

8

這將是適當的有一個表。當你有n個按應用程序使用量增長的表時,你正在描述使用數據庫本身作爲表的表,這不是RDBMS設計的工作方式。現代數據庫中的單個表中的數十億記錄是微不足道的。在那個級別上,你唯一的性能問題是好的索引以及你如何進行連接。

+2

添加到此答案...您也可以基於某個維度聯合表格。因此,從機械上看,它看起來像分開的表格一樣執行,但使用索引無縫地綁定在一起。同樣,需要來自OP的更多信息。 – 2009-07-17 21:28:17

4

雖然每個聊天室都可以執行一個表,但每個數據庫對可創建的表的數量都有限制,所以給定無限數量的聊天室時,您需要創建無限數量的表,即不去上班。

另一方面,您可以存儲數十億行數據,存儲通常不是空間問題 - 但在合理的時間範圍內檢索信息是需要謹慎規劃的。

您可以按日期範圍對郵件進行分區,如果計劃完成,您可以使用LUN遷移將較舊的數據移動到較慢的存儲上,同時在較快的存儲中留下較新的數據。

8

數十億條記錄?

假設您持續有1000個活動用戶,每分鐘發送1條消息,則每天發送1.5mio消息,每年發送約500mio消息。

如果您還需要保存聊天消息幾年前(什麼?),你可以將它們歸檔到年爲表。

我肯定會反對的動態創作室爲基礎的表。

+1

同意。爲什麼你需要一個數據庫來登錄?只需使用.txt文件來存檔聊天。我假設你需要日誌 - 因爲這是你爲什麼想到數據庫的原因。如果您不需要執行讀取操作,則文件系統使用情況會更好。 – Zack 2009-07-17 21:46:32

2

嚴格地說,你的設計是正確的,一個單一的表。低熵的字段{例如'userid' - 您想要從ID表中鏈接,即遵循正常的數據庫規範化模式}

您可能想考慮基於範圍的分區。例如您的表的「副本」和一年前綴。或者甚至可能只是一個'當前'和歸檔表

這兩種方法都意味着您的查詢語義更復雜(考慮是否有人進行了多年搜索),您將不得不查詢多個表。

然而,好處是您的'當前'表格將保持大致恆定的大小,並且歸檔更直接。 - {你可以刪除表2005_Chat時要存檔2005年的數據}

-Ace

相關問題