2009-09-15 36 views
0

我不知道我100%明白數據庫的作用。如果我只是有一些誤解,請指出。Django的數據創建和提交

比方說,我有一個函數,想要在數據庫中創建100個具有100,000個條目的新條目。

當這100個條目獲得創建並且在創建最後一個條目後進行提交時,似乎要快得多。

現在,如果這100個條目是由不同的用戶創建的,那麼只有在創建了100個條目後纔有提交的簡單方法嗎?

編輯: 我應該寫一些緩衝區?

回答

2

數據庫針對基於集合的操作進行了優化,因此是的,一次插入100個記錄的速度會快於一次。但是,當您談論用戶每次輸入記錄時,您不希望在任何我能想到的情況下將它們組合在一起。爲什麼?

首先,如果有一個不良記錄,其他人將失敗。這將使99個用戶中有100個(實際上是100個),但其中一個不會因爲開始時輸入錯誤數據而導致系統故障。 其次,用戶輸入後不會立即看到記錄。在輸入數據之前,他們將無法對這些記錄做進一步處理,例如將數據輸入相關表格。有這樣的延遲會讓用戶胡思亂想。如果用戶通過電話向客戶輸入數據,他們會特別胡思亂想(我在一個呼叫中心工作,商業產品速度非常慢,並且相信我知道用戶曾經得到過多麼不安)! 三,用戶將會繼續其他事情,並且不會意識到他們的數據因爲不良信息而被拒絕,而不是一件好事。 您要等多久才能獲得您設置的記錄數? 5秒鐘,十分鐘? 如果由於某種原因,網絡連接在此期間丟失,會發生什麼情況,用戶會丟失他們輸入的數據。

2

可能能夠破解這樣的事情一起,但你真的應該沒有,因爲它擊毀你的數據的完整性,這是使用交易的全部意義。

在您提出的解決方案中,批次中任何插入的問題都會導致來自完全不同用戶的所有其他(可能完全有效)插入失敗。另外,用戶將無法看到他們剛剛嘗試插入的數據,因爲系統在等待批量填滿之前等待插入。

P.S.這是一個quick intro to transaction processing

1

我想你確實有一種誤解。這聽起來像是你將數據庫看作只是某種「長期」內存的東西。這是一個糟糕的概念;該數據庫只有你的應用程序具有的內存。即使這不是真的,最好假裝它是。

要更深入一點,你的應用有:

  • 的作用域存儲器:變量定義視圖功能內,例如。當流量離開功能時,這些全部被破壞。
  • 全局變量:在代碼的最外面部分定義的變量。除了配置常量之外,不要將它們用於任何狀態。重要的是你應該依賴任何動態行爲。否則,你將不得不對付併發分叉的進程(取決於服務器網關),這些進程不知道彼此。只是不要這樣做。
  • 一個緩存方案,如果你選擇實現一個。這在django中完全是可選的,並且有很多方法可以做到這一點。但是,通常使用一些方案來確保即使緩存崩潰,數據庫也能準確反映數據的當前狀態。
  • 您的本地文件系統。從設計的角度來看,大多數利用這種方式的方法要麼像上面的緩存系統,要麼笨拙而脆弱。從性能角度來看,它可能與數據庫一樣緩慢。
  • 您的數據庫。

因此,您會發現除了數據庫之外,沒有太多的地方可以放置數據。