2009-07-15 51 views
4

我有3個表:Mysql的貯藏序列化陣列

  1. 區表,其具有1500個城鎮它。
  2. 類別表具有1800個類別。
  3. 公司包含業務的表。

我需要做的是抓住一個城鎮,例如Br​​imingham,並在Array中列出哪些類別有使用我們主公司表的業務,所以我們沒有存儲在數組中的任何類別在布萊明翰有業務。

我遇到的問題是存儲數組的大小,當我用序列化數組填充所有城鎮時,我甚至無法打開表來瀏覽。請參閱下面的數組示例:

a:9:{s:8:「執行官」s:1:「1」s:20:「商業顧問」; s:1:「1」; s:25 :「汽車修理廠和機械師」; 1:「1」; 35:「養殖牲畜和其他動物」; 1:「2」; 19:「時尚配飾」; 1: 1「; s:6:」酒店「; s:1:」1「; s:20:」郵局服務「; s:1:」1「; s:13:」學校州「; s: 「1」; s:14:「Wood Craftsmen」; s:1:「1」;}

任何人都可以提出一種替代解決方案嗎?

乾杯

+0

更新:序列化數據大到存儲例如倫敦在所有1800個類別中都有業務,我可以爲每個城鎮創建靜態HTMl頁面,但它會給我1500個HTMl頁面。 有誰知道服務器不得不篩選1500個HTML頁面的缺點,直到它找到包含正確的一個? – 2009-07-15 11:26:56

回答

8

我建議得到完全擺脫了存儲問題的一個完全不同的方法,而應該讓你的應用更加高效。無論如何,存儲可從數據庫中檢索到的信息的序列化數組是冗餘且效率非常低的。這裏最好的辦法是規範化你的數據。

你應該創建第四個表,或許叫「region_categories」,這將是一個簡單的查找表:

CREATE TABLE region_categories (
    regionId int unsigned not null, 
    categoryId int unsigned not null, 
    PRIMARY KEY(regionId,categoryId) 
); 

現在,而不是保存一切到一個數組,每個鎮/地區而應該使用該城鎮中的類別填充此表。您的數據量非常小,因爲您存儲的只是一對ID。

當談到時間來檢索類別對於給定的區域,你只需要運行一個簡單的SELECT聲明:

SELECT category.* 
FROM region_categories AS rc LEFT JOIN categories AS c ON rc.categoryId=c.categoryId 
WHERE rc.regionId=[whatever region you're dealing with] 

現在,你可以通過你的結果迭代,你會擁有所有的類別爲該地區。

+0

歡呼聲謝謝你的迴應作品魅力! – 2009-07-29 10:56:58