MySQL: одна строка или больше? - PullRequest
       1

MySQL: одна строка или больше?

3 голосов
/ 03 сентября 2010

У меня есть любой контент с идентификатором, здесь я могу указать несколько types для контента.

Вопрос в том, стоит ли использовать несколько строк, чтобы добавить несколько типов, или использовать поле type, поставить типы, разделенные запятыми, и разобрать их в PHP

Несколько строк

`content_id` | `type`

1            | 1
1            | 2
1            | 3

VS

Одна строка

`content_id` | `type`

1            | 1,2,3

EDIT


Я ищу более быстрый ответ, а не более легкий, пожалуйста, учтите это. Производительность действительно важна для меня. Итак, я говорю о действительно огромной базе данных с millions или ten millions строками.

Ответы [ 6 ]

5 голосов
/ 03 сентября 2010

Как правило, я всегда рекомендую подход с несколькими строками, поскольку он имеет несколько преимуществ:

  • Вы можете использовать SQL для возврата, например, WHERE type=3 без особых затруднений, поскольку вам не нужно использовать WHERE type LIKE '%3%', что менее эффективно
  • Если вам когда-нибудь понадобится сохранить дополнительные данные для каждой пары content_id и type, вам будет намного проще в многострочной версии
  • Вы сможете применять один или несколько индексов к своей таблице, когда она хранится в формате «несколько строк», чтобы повысить скорость получения данных
  • Проще написать запрос на добавление / удаление пар content_id и type, если каждая пара хранится отдельно, чем когда вы сохраняете их в виде списка через запятую
  • (почти) всегда будет быстрее позволить SQL обрабатывать данные, чтобы получить подмножество, чем передавать их в PHP или что-то еще для обработки

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

4 голосов
/ 03 сентября 2010

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

2 голосов
/ 03 сентября 2010

Нормализованный или ненормализованный дизайн. обычно я бы рекомендовал придерживаться стиля «несколько рядов» (нормализовано) Хотя иногда (по соображениям производительности / хранения) люди сознательно применяют стиль «одной строки».

Посмотрите здесь:

http://www.databasedesign -resource.com / denormalization.html

2 голосов
/ 03 сентября 2010

Используйте несколько строк.Таким образом, вы можете индексировать этот столбец type позже и искать его быстрее, если потребуется в будущем.Также он удаляет зависимость от вашего языка интерфейса для анализа результатов запроса.

1 голос
/ 03 сентября 2010

Никогда, никогда, никогда не объединяйте несколько логических полей в одно поле с разделителями-запятыми.

Правильный способ - создать несколько строк.

Если есть какая-то причина производительности, которая требует, чтобы вы использовали одну строку, по крайней мере, сделайте несколько полей в строке. Но, тем не менее, почти никогда нет веских причин для этого. Сначала сделайте хороший дизайн.

Вы когда-нибудь хотели знать все записи, скажем, с type = 2? С несколькими строками это легко: «выберите content_id из mytable, где type = 2». В поле «забито» вам нужно будет сказать «выберите content_id из таблицы, где введите«% 2% »». О, кроме того, что происходит, если существует более 11 типов? Приведенный выше запрос найдет «12». Хорошо, вы могли бы сказать "где тип как '%, 2,%'". За исключением того, что не работает, если 2 является первым или последним в списке. Даже если вы нашли способ сделать это надежно, поиск LIKE с начальным% означает последовательное чтение каждой записи в таблице, что очень медленно.

Насколько велико будет поле для вскармливания? Что если строка типов слишком велика, чтобы уместиться в вашем максимуме?

Есть ли у вас какие-либо данные о типах? Если вы создадите вторую таблицу с ключом «type» и, скажем, описанием этого типа, как вы присоединитесь к этой таблице. С несколькими строками вы можете просто написать «select content_id, type_id, description из типа объединения контента с использованием (type_id)». С забитым полем ... не так просто.

Если вы добавите новый тип, как вы сделаете его согласованным? Предположим, раньше говорилось «3,7,9», а теперь вы добавляете «5». Вы можете сказать «3,7,9,5»? Или они должны быть в порядке? Если они не в порядке, невозможно проверить на равенство, потому что «1,2» и «2,1» не будут выглядеть одинаково, но они действительно эквивалентны. В любом случае обновление поля типа теперь становится программой, а не отдельным оператором SQL.

Если есть какое-то тривиальное увеличение производительности, оно того не стоит.

1 голос
/ 03 сентября 2010

Один ряд может быть лучше в нескольких случаях.Отчетность имеет тенденцию быть легче с некоторой денормализацией, является основным примером.Так что, если ваш код чище / работает лучше с одной строкой, то сделайте это.В противном случае лучше всего было бы использовать несколько рядов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...