2011-12-23 50 views
4

我正在尋找關於我正在構建的東西的建議:我有一個創建,更新和刪除記錄的PHP應用程序,但它緊密集成在傳統的非基於sql的數據庫中,當你開始做大量的數據庫調用時,它會變得非常慢。 我希望爲用戶提供更多的背景體驗,以便在用戶創建或編輯某些內容時,需要將所有變量,數組和對象寫入MySQL數據庫,然後啓動後臺腳本以讀取這些記錄並處理對遺留數據庫的請求。關於創建PHP-MySQL後臺任務的建議

所以我需要一張表來跟蹤任務,然後再跟蹤所有變量,對象,數組和值的表。

這裏就是我想第二個表的數據庫結構必須是:

  • 存儲TASK_ID
  • 一列來存儲,如果VAR是一個數組或對象A柱,如果它是一個簡單的var,則爲NULL。
  • 一列用於存儲數組/對象var的名稱。
  • 一列,如果它是一個對象,則存儲它的對象類型。
  • 用於存儲陣列/對象組ID的列。 (用於跟蹤什麼瓦爾屬於對象/陣列)
  • A柱以存儲對象的簡單變種,方法或名稱的名稱/陣列
  • A柱來存儲var值

這裏是幾個例子:

1 | NULL  | NULL  | NULL   | NULL | 'foo'  | 'bar' 
1 | 'array' | 'foo_array' | NULL   | 1 | 'foo'  | 'bar' 
1 | 'array' | 'foo_array' | NULL   | 1 | 'foo2'  | 'bar2' 
1 | 'object' | 'foo_obj' | foobar_object | 2 | 'foo_method' | 'bar' 
1 | 'object' | 'foo_obj' | foobar_object | 2 | 'bar_method' | 'foo' 

這個問題似乎像一個過於複雜的方法?我是否瘋了並且在想這個?有人可以想出一個更好的方法,我應該這樣做嗎?

謝謝。

+0

它幾乎聽起來像這種方法可能會使經驗變得更糟,因爲在處理隊列之前用戶交互不會寫入您的數據庫。任何你無法遷移的理由? – 2011-12-23 20:43:00

回答

3

使用serialize()

它會生成一個特殊格式的字符串(您可以在數據庫中存儲)。該字符串是特殊的,unserialize()可以將它翻譯回原來的php值。它維護一個變量類型,值和結構。自定義對象和多維數組沒有問題。

你仍然需要你的數據庫表的一部分,這只是爲你做了很多工作,並做得很好。

+0

我從來沒有使用序列化。你介意闡述嗎? – Slowfib 2011-12-23 20:30:57

+0

你剛剛吹噓我的思想克里斯!謝謝,顯然這比我預期的要容易得多! – Slowfib 2011-12-23 20:45:05

1

我會創建一個表有主鍵(task_id可能),然後一列存儲變量的序列化散列(或可能是json編碼)。你甚至可以將它存儲在跟蹤任務的原始表中。我假設表將必須在值的狀態欄:

等待, 處理, 完整, 錯誤

當我們做到這一點的房子裏,我們只使用一個TINYINT(1)無符號欄。您也可以在任務創建,啓動和完成時添加時間戳字段或三個時間戳字段。一旦你滾動,這一切都很簡單。

+0

是的,身份的ID和一些其他的東西來識別該行。而且,是的,你說得對,我可能只需要一張表就可以得到所有這些數據。爲什麼要存儲變量的序列化哈希?爲什麼不直接存儲它?爲了安全起見? – Slowfib 2011-12-23 20:50:41

+0

我通常將其存儲爲散列,以便更容易地解析,並且可以存儲無限數量的數據。某些任務可能需要2個變量,其他任務可能需要50個。通過使用散列,我可以將所有信息存儲在單個列中。 – mylesmg 2012-01-03 19:56:22