2014-05-19 36 views
0

我在尋找一些一般建議。我現在有一個數據庫(使用PHP,Apache和MySQL)運行爲這樣:多用戶訪問單表

  1. 用戶上傳數據到DB,1
  2. 用戶上傳更多的數據存儲在表的DB,存儲在表2.
  3. 用戶運行用於待穿越兩個表中引用,並將結果存儲在表3
  4. 表3被處理,並且所得到的信息存儲在表4
  5. 表1,表2和查詢3被刪除(準備下一個上傳/交叉引用)。

數據庫如何工作的細節是學術性的。我遇到的問題是,在任何時候都可能有多個DB用戶登錄。這導致如果一個用戶當前正在處理表3(步驟4)中的數據並且另一用戶運行交叉引用查詢(步驟3),那麼由第一用戶使用的信息將被新數據覆蓋。表4是一個不斷增長的結果「緩存」,因此不應該受多個用戶同時添加(該表使用auto_increment字段,因此應該沒有重複記錄問題)的影響。

有沒有人有關於如何完成這一任務的一般想法?該網站需要在任何時間允許多達50個用戶(理想情況下)和5-10個用戶。

爲每個用戶創建一個單獨的表格看起來像是浪費空間和精力(並未提及用新代碼更新它們!)。我想創建「一次性使用」表(可能與用戶登錄名關聯),這些表將在文件上傳,使用和刪除完成後創建。這是好的做法還是會導致進一步的問題。

這是我部署的第一個網站/數據庫,因此我不太確定最佳實踐/陷阱。任何建議將不勝感激。

非常感謝

+0

爲什麼在同一個表中有多個表而不是簡單的多行?您可以使用登錄名或PHP會話標識將表索引到表中。 – Baldy

+0

你真的需要這個過程的數據庫表嗎?你可以將數據存儲在文件中並進行內存中的處理嗎? – Halcyon

+0

你總是可以[鎖定你的表](http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html),但這似乎是(出現)是設計問題的解決方法。當然你可以找到一個更好的方式來做這個,而不需要在數據庫上做太多的工作。 – Crackertastic

回答

0

你爲什麼不爲用戶名用戶名引用用戶表,這樣你將在該表中多行,但是用戶標識添加一列。確保將索引添加到userID列。

而且你應該使用InnoDB的引擎,因爲它使用RowLevel,而不是鎖定TableLocking的的MyISAM一樣。

+0

我不敢相信我忽略了這樣一個簡單的解決方案!我會放棄它。非常感謝! – robbiecutting

0

您可以鎖定整個交易行,禁止任何人與他們進行互動,這可能是與InnoDB表型來完成,或者您可以鎖定在MyISAM表類型整個表。

你可以找到信息on official mysql docs page

2。

在表1和表2中保留一些唯一的用戶標識符(和/或時間戳),並偶爾按這些列刷新它們。

MYSQL有特殊的語法做交易,把它們看成一堆的SQL查詢,在後臺運行,並在臨時空間存儲結果,和保存數據的所有操作完成之後。

Here's the link

如果使用臨時表是不是強制性的,這是更好地處理這類邏輯除了SQL服務器,對C++,Java或PHP前。在SQL上編寫/選擇/清除大量臨時數據並不是很有效。