2011-01-09 2 views
1

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

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

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

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

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

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

Что делать !?

ответ

0

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

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

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; 
4

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

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

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

+0

спасибо за советы! Я обязательно буду это делать – DropDeadFred81

1

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