MySQL: больше столбцов и больше запросов - PullRequest
1 голос
/ 09 января 2011

Поэтому я пытаюсь создать довольно большую базу данных для обработки видео и их тегов.Поскольку для видео можно выбрать только конечное количество тегов (27), я храню их в таблице шириной 28 столбцов (один столбец для каждого тега + идентификатор видео).

Моя проблема возникает, когда я хочуполучить количество раз, когда пользователю понравилось / не понравилось видео с определенным тегом (скажем, № 24).Каждый Like / Dislike получает строку в другой таблице.

Вот два варианта, которые я рассмотрел.

1) Добавьте еще 27 столбцов tinyint в таблицу пользователей , каждый из которых представляет количество голосов, за которые он проголосовал.видео с tagX.
PRO: легко выбирается
CON: удваивает объем данных, необходимых для каждого пользователя

2) Использование внутренних объединений
PRO: сохраняет размерsmall
CON: Сложнее в системе

И потому, что я оптимист, и потому что я пытаюсь использовать передовой опыт, я пытаюсь оптимизировать свои базы данных для 300 000+ пользователей, и эти цифры будутнужно много.Я сделал подсчет, и даже с 300 000 пользователей это только добавило бы около 27 мегабайт в мою базу данных.

Что делать!?

Ответы [ 3 ]

4 голосов
/ 09 января 2011

(это только мое мнение)

Я думаю, что вы оптимизируете слишком рано (и, вероятно, неправильно). Присоединения не так уж и дороги. У вас должна быть таблица пользователей, таблица тегов и аналогичная таблица. В зависимости от ваших точных запросов, вы, вероятно, найдете это немного дешевле.

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

1 голос
/ 09 января 2011

Ваша рациональность в денормации ошибочна.Сегодня вы можете подумать, что 27 видео - это максимум, но в будущем всегда будет еще один, два или более.

0 голосов
/ 09 января 2011

27 столбцов для пользовательской таблицы работают только при наличии 27 различных тегов.Таким образом, добавление другого изменения схемы запроса тегов (что плохо).

Я голосую за что-то вроде этого:

table users(
   user_id
  ,primary key(user_id)
);

table videos(
   video_id
  ,primary key(video_id)
);

table tags(
   tag_id
  ,tag_name
  ,primary key(tag_id)
);

table video_tags(
   video_id
  ,tag_id
  ,primary key(video_id, tag_id)
);

table user_likes(
   user_id
  ,video_id
  ,primary key(user_id, video_id)
);

Чтобы показать количество голосов на тег, вы должны сделатькак то так:

select c.tag_name
      ,count(*)
  from user_likes a
  join video_tags b uing(video_id)
  join tags       c using(tag_id)
 where a.user_id = ?
 group 
    by c.tag_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...