2012-06-27 90 views
1

我正在研究醫療軟件,我的目標是將大量自定義操作存儲到數據庫中。由於跟蹤誰做了什麼非常重要,每次用戶做了一些有意義的事情(例如寫評論,添加一些醫療信息等),就會產生一個行動。現在的問題是,隨着時間的推移,將會有的行動,比方說每個病人10000個,並且可能有50000個病人,導致總共5億次行動(甚至更多)。有很多行的實體框架

目前數據庫模型看起來是這樣的:

[Patient] 1 -- 1 [ActionBlob] 

所以每個患者只是有一個大斑點,其中包含所有動作大序列化的字節數組。當表變大時,這當然不起作用,因爲我必須在數據庫和客戶端之間來回傳輸整個字節數組。

我的下一個想法是有單獨的序列化操作的列表(而不是一大塊),即

[Patient] 1 -- * [Action] 

,但我開始懷疑這是否是一個很好的方法還是不行。現在當我添加新的動作時,我不必序列化所有其他動作並將它們傳送到數據庫,但只需序列化一個動作並將其添加到動作表。但是如何加載數據,它會超級低,因爲在一個表中可能有5億行?

所以基本上問題是:

  1. 可以在SQL從表10000行的服務器手柄裝載500萬行? (這些數字可能會更大)
  2. 實體框架能夠處理10000個實體的實現而不會很慢嗎?
+2

分區表應該針對您的需求 – Alex

回答

1

你的第二個想法是正確的,具有較小萬件不是SQL數據庫的問題,如果你還指數在動作表一些有用的列,這將導致更快的性能。

存儲行動爲BLOB是非常糟糕的主意,因爲每次你將不得不從斑點個人記錄轉換爲搜索,它不會提供搜索有什麼好處等

正確索引十億記錄是不是在所有SQL服務器的問題。

而在沒有用戶界面的情況下,我們會一次看到百萬條記錄,我們總是會記錄1到99,100到199等記錄。

我們有近1000萬行的表格,但一切都很流暢,因爲頻繁搜索的列索引,外鍵索引。

1

對問題1和問題2的簡短回答:是的。但是,如果你一次性做出這些「物化」,你應該使用SqlBulkCopy。 我建議你看看下面的例子:

關於你的模型,你絕對不應該使用一個blob存儲操作。有一個包含Patient外鍵的Action表,並確保在此表中有一個時間戳列。 這樣,無論何時您必須爲給定患者加載操作,都可以使用時間作爲過濾標準(例如,加載過去2個月的操作)。

由於您可能要爲給定患者提取操作,因此請確保將Patient FK設置爲​​索引。

希望這會有所幫助。

問候, Calil