2011-06-27 52 views
1

我正在創建一個數據庫,該數據庫將存儲100.000(可能更多將來)的用戶。雖然這顯然發生在每個用戶有1行的表格中,但每個用戶都可以(並且將)存儲數百個項目。在編程語言中,這意味着用戶有2個整數的數組(或一個2維數組):itemid的列和數量的列。將整數數組存儲在數據庫中

我的直覺告訴我創建一個表來保存所有這些項目,像行(userid,itemid,amount)。但是,這會導致一個巨大的桌子。 200,000個用戶,每個250個項目...這是一個表中的5000萬條目。這一點,再加上桌子將經歷持續快速變化的事實,使我感到害怕。 (有多快?我估計每秒最多100次修改。)

通常會有100到2000個用戶之間的任何地方,所有添加和刪除項目以及修改金額。這些操作可以並將在編程代碼中發生。它會去如下:

  • 用戶啓動會話,程序從數據庫加載
  • 用戶修改項目列表
  • 每隔幾分鐘所有用戶的項目,所做的更改保存到數據庫中
  • 當用戶結束會話時,它也會保存到數據庫中

值得注意的是,用戶可以存儲的項目數最大。

是否有任何替代使用單獨的表?也許保存格式化文本字符串中的值?或者,這是使用MySQL數據庫實際上是一個糟糕的想法?

謝謝你的時間和見解。

+0

這正是關係數據庫的用例。 – Rafe

回答

4

我的直覺告訴我,創建一個表來保存所有這些項目

你的直覺是正確的。

1)避免過早優化

2)不破規範化的規則,除非你有一個很好的和實際的理由這樣做

3)你爲什麼懷疑多表方法會更快?

這是在一個表50萬個條目

還等什麼?即使你只有一個userid索引,與每個用戶的單個表相比,性能的差異也不會明顯變慢(實際上,在200,000個用戶的情況下,它會快得多 - 因爲DBMS可以舒適地保持開放文件句柄爲每個表!)。

我估計高達100次修改第二

應儘可能使用MySQL和相當基本的硬件,但如果是我,我想一點餘量,我會去用一對鏡像SATA磁盤,一個鏡像上的表,另一個上的索引。

我會關心的唯一問題(適用於您選擇的兩種型號中的哪一種)支持2000個併發連接。連接必須是併發的嗎?或者,每個用戶都可以下載一個工作集(可選地使用樂觀鎖定策略)並關閉連接,然後推回新連接上的更改?如果沒有,那麼你可能需要一個很好的內存和CPU的重擊。

但是不管是使用一個大表還是多個小表,如果這是數據的唯一用途,並且訪問對於特定數據項不是併發的,那麼爲什麼還要使用關係數據庫呢? NoSQL或共享文件系統也可以工作。

+0

當我提到2000用戶同時更改的東西,我不是指2000實際的數據庫連接。將運行一個服務器端應用程序,其中有幾個工作線程處理用戶請求並使用連接池訪問數據庫。 現在有一個系統(不是我自己創建的)爲每個用戶保存一個包含所有項目的文本文件,並且每2分鐘用一個更新版本替換文本文件。我的任務是用更乾淨的東西來替換這個混亂的系統。關係數據庫似乎是合乎邏輯的,因爲一切都通過id(PK/FK風格) – Rapsey

0

應該可以像使用兩個表格所描述的那樣進行。數據庫應該能夠處理數百萬條記錄。

要看的重點:

1-儘可能優化您的查詢。

2-創建適當的索引以加快查詢速度。

3-如果您有併發讀取/更新操作,使用InnoDB,因爲它支持行級鎖定而不是MyISAM。

4-提供良好的硬件來支持數據庫服務器。

5-如果負擔得起,在專用服務器上運行數據庫服務器。

+0

我將執行並基準您的建議。非常感謝,我希望它會表現良好。 :) – Rapsey

0

將數據作爲數組放入一個字段幾乎總是一個錯誤。它使得查詢數據更困難,耗時更多,而且使用索引的可能性也更小。沒關係,如果這些值只是文本而不需要爲數組找到一個或多個元素,但是我的經驗是這種情況很少遇到。現代數據庫甚至可以處理5000萬條記錄,甚至不用冒汗。這是一個以數據庫方式表示的小桌子。