Денормализация схемы от 1 до многих

У меня есть структура таблицы в MySQL, где у меня есть следующая структура:

home_id, home_name, дата добавления

У меня есть другая таблица, называемая спецификациями, со следующей структурой:

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

Как видно из вышеизложенного, а) не все записи имеют значение для всех столбцов. б) Структура таблицы не подходит для запросов типа INSERT INTOdenormalized_homesselect * fromspecs. Я также не могу использовать хранимые процедуры или триггеры (правила хоста).

Тактика, которую я использовал до сих пор, заключается в том, чтобы вставить 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";

Создание запроса для каждого возможного столбца, а затем их запуск работают. Я просто думаю, что должен быть лучший способ, не так ли?


person StackOverflowed    schedule 10.10.2012    source источник
comment
Я буду, я всегда оставляю вопрос без ответа на несколько дней, чтобы это не мешало людям отвечать, если у них есть что предложить.   -  person StackOverflowed    schedule 11.10.2012


Ответы (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'
person Tom    schedule 10.10.2012
comment
Любые несуществующие спецификации будут иметь нулевое значение. - person Tom; 10.10.2012