Автор Тема: Грамотная структура базы для хранения голосов  (Прочитано 6833 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как грамотно организовать структуру MySQL базы для хранения информации для:
есть сайт, скажем фотосайт со множеством фотографий
пускай их в базе будет 1 млн.
есть пользователи на сайте, их скажем 100 тыс.

пользователи могут голосовать за фотографии
если все пользователи проголосуют за все фотографии то имеем 100 млн. голосов

надо организовать базу грамотно так чтобы скрипт как можно быстрее мог смотреть голосовал ли конкретный пользователь за конкретную фотографию и если да то повторый голос не засчитывать

у меня два способа как это организовать
первый
два стобца
user_id | photo_id
и так для каждого голоса прописывать новую запись
и того в нашем примере получаем 100 млн. записей

стрёмный способ

способ второй
два стобца
user_id | array_photo_id
то есть если пользователь хотя бы один раз за какую-то фотку проголосовал то для него создалась запись
user_id | array_photo_id
и уже для последующих его голосов в столбец array_photo_id добавлять новые photo_id скажем через запятую

и потом уже при проверки забирать весь масив и скажем смотреть через in_array есть ли уже такой photo_id или нет

если кому нарвится второй способ то каком виде лучше хранить столбец array_photo_id?
как text или что посоветуете?
всё-таки это массив будет очень большим если скажем пользователь сделал 100 тыс. голосов или даже 1 млн.

или кто что посоветует
какие другие есть способы для реализации данной задачи?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #1 : 01 Октября 2004, 14:11:34 »
стремный способ.

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #2 : 01 Октября 2004, 14:17:11 »
Готов выслушать любые предложения
вплоть даже до того, чтобы кто-то привёл причины почему не стоит хранить все голоса до бесконечности!

кстати, забыл упомянуть что у первого способа есть один большой плюс
скажем при удалении фотографии можно легко и быстро удалить и все её логи по голосам из базы чтобы её не загромождать и к тому же нам эти логи больше не понадобяться

со вторым же способом это тоже сделать реально
но уж больно муторно и долго

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #3 : 01 Октября 2004, 14:18:45 »
Цитировать
RomikChef:
стремный способ.

в смысле ты предлагаешь выбрать первый вариант?
я вот тоже к нему склоняюсь

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
Грамотная структура базы для хранения голосов
« Ответ #4 : 01 Октября 2004, 14:22:39 »
Цитировать
Miracle:
в смысле ты предлагаешь выбрать первый вариант?
я вот тоже к нему склоняюсь

самое главное - не забывать про индексирование!

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #5 : 01 Октября 2004, 14:23:48 »
Цитировать
Forza:
самое главное - не забывать про индексирование!

конечно
это самособой разумеющееся

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
Грамотная структура базы для хранения голосов
« Ответ #6 : 01 Октября 2004, 14:30:43 »
Цитировать
Miracle:
конечно
это самособой разумеющееся

Тогда только стрёмный способ. Второй не отвечает теории реляционных БД.

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #7 : 01 Октября 2004, 14:34:12 »
Спасибо большое!

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #8 : 01 Октября 2004, 17:59:06 »
вот тут проблема возникла
остановимся на первом способе

и так, какие действия мы будем делать с этой информацией?
1. смотреть есть ли записи user_id | photo_id
если есть то не позволяем голосовать
для быстрого нахождения используем multipile_column_indexes
так как это быстрее в случаем поиска сразу по двум параметрам
(а ведь мы помним что при наших идеальных условиях у нас 100 млн. записей)
и так как повтор user_id в десять раз будет встречаться чаще чем photo_id (соотношение 100 тыс. к 1 млн. при наших идеальных условиях 1/10) то нам выгодней выставить крайним левом префиксом столбец user_id
так и поступаем

2. если вдруг ник пользователя надо удалить из базы, то ради рациональности мы удаляем и все логи по голосованию данного пользователя
и тогда опять возвращаемся к нашего логу голосований
DELETE FROM voted_photos WHERE user_id = \'$user_id\';
и всё отлично, при поиске нужных строк будет использован индекс

3. нам надо удалить фотографию в том числе её инфо из логов голосований
DELETE FROM voted_photos WHERE photo_id = \'$photo_id\';
но вот беда
при той структуре индексов что мы создали в данной ситуации индексы не будут использованы
вот тут вся проблема

и так вопрос:
как всё таки в данной ситуации лучше сделать индексы
1. сделать раздельные индексы
отдельно user_id и отдально photo_id
но тогда мы будем терять в скорости при самой популярной операции обращения (проверки на существования user_id & photo_id)
2. сделать многостолбцовый индекс для user_id & photo_id и ещё сделать один раздельный индекс для photo_id
но тогда файл индексов будет значительно больше
а отсюда и сложность с ним работать
ну и конечно немного дольше будет заноситься новая информация так как надо создавать больше индексов

или может ещё какие варианты есть?
хотелось бы послушать

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #9 : 01 Октября 2004, 18:21:46 »
вообще никаких индексов не делать

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #10 : 01 Октября 2004, 18:33:14 »
Цитировать
RomikChef:
вообще никаких индексов не делать

какие плюсы?

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Грамотная структура базы для хранения голосов
« Ответ #11 : 01 Октября 2004, 19:00:40 »
Miracle
Цитировать
2. сделать многостолбцовый индекс для user_id & photo_id и ещё сделать один раздельный индекс для photo_id
но тогда файл индексов будет значительно больше
а отсюда и сложность с ним работать
ну и конечно немного дольше будет заноситься новая информация так как надо создавать больше индексов

интересно в чем сложнось??? :)

Зачем тебе индексы, если у тебя в таблице 2 поля, оба из которых индексные? У тебя индекс будет просто дублировать таблицу... а скорость - никакой скорости...

А причем здесь PHP???

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #12 : 01 Октября 2004, 19:07:19 »
Цитировать
Phoinix:
интересно в чем сложнось???

база будет тяжелей

Цитировать
Phoinix:
У тебя индекс будет просто дублировать таблицу

ну я с планами на будущее
я ещё не уверен что будет только user_id и photo_id
вот всё думаю стоит ли добавить ещё пару полей
таких как какую именно оценку пользователь поставил и время когда он это сделал
просто может в будущем если уж слишком база будет большая то к примеру время голосования использовать для того что голоса старше к примеру двух месяцев удалять

вот такие дела

Цитировать
Phoinix:
А причем здесь PHP???

я думал на эту тему
но решил всё таки продолжить всё в этом топике
изначально запостил сюда так как думал что много предложений будет как с php всё это грамотно сделать

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #13 : 02 Октября 2004, 08:28:08 »
а какие минусы?

Оффлайн Miracle

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 32
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Грамотная структура базы для хранения голосов
« Ответ #14 : 02 Октября 2004, 12:27:03 »
Цитировать
RomikChef:
а какие минусы?

ну если в таблице будут не только user_id и photo_id
а ещё два столбца
то ведь минусы есть?
в быстродействии поиска или как?
выгодней сделать иедксы по второму варианту что я описал выше

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28