2012-10-10 60 views
0

我有MySQL中的表結構,我有以下結構:反規範化1的許多模式

HOME_ID,HOME_NAME,dateadded

我有另一個表稱爲規格與下面的結構:

HOME_ID,spec_key,spec_value

在這裏面我可以有條目類似如下:

1, price, 500000 
1, location, 90210 
1, rooms, 3 
1, washrooms, 3 
1, furnished_basement, 0 
2, location, 14410 
2, garage_size, 3 
2, price, 335000 

對於搜索的目的,我想非規範化以上。表(denormalized_homes)的結構將類似於:

home_id, price, location, rooms, washroom, furnished_basement, garage_size, dateadded 

正如你可以從上面看到的,)不是所有的條目在所有列的值。 b)表結構不利於INSERT INTO denormalized_homes select * from規格類型查詢。我也不能使用存儲過程或觸發器(主機規定)。

到目前爲止,我所採取的策略是插入HOME_ID到denormalized_homes表,然後通過各個領域的規範的東西,如下面的查詢運行:

UPDATE `denormalized_homes` dh, specs s SET dh.price = s.spec_value WHERE dh.home_id = s.home_id AND s.spec_key = "price"; 

創建爲每個可能的列的查詢然後運行它們的作品。我只是在想,一定有更好的辦法,是嗎?

+0

我會,我總是留下未回答此問題幾天,以便它不從,如果他們有別的東西來提供回答阻止人們。 – StackOverflowed

+0

啊,好的。疑難雜症。謝謝。 – Tom

回答

1

我想你可以做這樣的事情:

INSERT INTO denormalized_homes() 

SELECT h.home_id, 
     price.spec_value price, 
     location.spec_value location, 
     rooms.spec_value rooms, 
     washroom.spec_value washroom, 
     furnished_basement.spec_value furnished_basement, 
     garage_size.spec_value garage_size, 
     h.date_added 

FROM homes h 

     LEFT JOIN specs price 
     ON price.home_id = h.home_id and spec_key = 'price' 

     LEFT JOIN specs location 
     ON price.home_id = h.home_id and spec_key = 'location'  

     LEFT JOIN specs rooms 
     ON price.home_id = h.home_id and spec_key = 'rooms' 

     LEFT JOIN specs washroom 
     ON price.home_id = h.home_id and spec_key = 'washroom' 

     LEFT JOIN specs furnished_basement 
     ON price.home_id = h.home_id and spec_key = 'furnished_basement' 

     LEFT JOIN specs garage_size 
     ON price.home_id = h.home_id and spec_key = 'garage_size' 
+0

任何不存在的規格將只有一個空值。 – Tom

+0

非常好!做得好。 – StackOverflowed

+0

沒問題。樂意效勞。 – Tom