Головная боль MySQL, я должен или не должен? - PullRequest
1 голос
/ 05 февраля 2010

У меня есть сайт объявлений.Я использую SOLR для индексации и хранения данных.Затем у меня также есть база данных MySQL с дополнительной информацией о классифицированных, которые я не храню или не индексирую.

Теперь у меня есть довольно нормализованная база данных с 4 таблицами.на веб-сайте SOLR выполняет поиск и возвращает массив идентификаторов ID_numbers, которые затем будут использоваться для запроса mysql.Поэтому solr возвращает id: s, которые затем используются для получения всех объявлений из базы данных mysql с идентификатором THOSE: s.

Теперь все соединения и отношения между моими таблицами вызывают головную боль.

Что, кроме удобства обслуживания я могу получить за наличие нормализованной базы данных?

Могу ли я знать, сохранить всю информацию в одной таблице с примерно 50 столбцами.

Так что вместо этого длянайти одно объявление и показать его:

SELECT 
  category_option.option_name,
  option_values.value 
FROM classified, category_option, option_values 
WHERE classified.classified_id=?id 
AND classified.cat_id=category_options.cat_id 
AND option_values.option_id=category_options.option_id

Я мог бы использовать это:

SELECT * FROM table_name WHERE classified_id = $classified_id

Разве последнее не является на самом деле быстрее?Или нормализованная БД работает быстрее?

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 февраля 2010

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

Здесь довольно хорошая ссылка о нормализации (и денормализации). Здесь вопрос о денормализации. В одном ответе предлагается создать представление, используя объединения для получения нужных вам данных, и использовать их, например, запрос SELECT * FROM table_name WHERE classified_id = $classified_id. Нормализованная БД, скорее всего, будет медленнее, но вряд ли вы захотите денормализовать по этой причине. Я надеюсь, что это поможет.

2 голосов
/ 05 февраля 2010

Запрос с использованием JOIN является тривиальным в том, что касается соединений MySQL. Я не вижу необходимости денормализовать это.

Однако я бы предложил переписать его так, чтобы он не был таким PITA, чтобы читать:

SELECT 
  category_option.option_name,
  option_values.value 
FROM classified
JOIN category_option USING (cat_id)
JOIN option_values USING (option_id)
WHERE classified.classified_id = ?
2 голосов
/ 05 февраля 2010

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

  • Сколько раз будет выполняться запрос?
  • Это приложение с высоким трафиком?
  • Можете ли вы добавить кеш?
...