0

MySQLにテーブル構造があり、次の構造があります。

home_id、home_name、dateadded

次の構造を持つspecsという別のテーブルがあります。

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

上記からわかるように、a)すべてのエントリがすべての列の値を持っているわけではありません。b)テーブル構造は、INSERT INTOdenormalized_homesselect * 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";

可能な列ごとにクエリを作成して実行すると、機能します。もっと良い方法があるに違いないと思っているだけですよね?

4

1 に答える 1

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'
于 2012-10-10T13:44:28.800 に答える