За последние 24 часа нас посетили 20980 программистов и 1107 роботов. Сейчас ищут 457 программистов ...

База звездного рейтинга. Структура.

Тема в разделе "PHP и базы данных", создана пользователем ghostcom, 1 июн 2017.

  1. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Всем привет! Требуется адекватный совет. Пишу свой ajax звездный рейтинг дошло дело до базы данных и не могу определиться со структурой. В таблице требуются три колонки. ID, ItemID, Vote.
    В мыслях два варианта:
    1. Каждый раз новая запись для каждого голоса.
    2. Одна запись для каждого материала (ItemID) и ее обновление при каждом новом голосе через implode.

    Нужно самое легкое и производительное решение. В первом случае будет огромное кол-во строк. Во втором может возникнуть проблема при одновременном использовании несколькими юзерами (или нет?). Да и каждй раз разбивать строку, добавлять голос и преобразовывать обратно перед обновлением +подсчет общего и среднего кол-во голосов.
    У кого какие мысли??
     
  2. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    В принципе вопрос заключается: первый или второй вариант?
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    две таблицы.
    Опросы: id_опроса, название опроса
    Варианты: id_варианта, id_опроса, количество голосов.
     
  4. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Вы похоже не поняли вопроса. У меня не опрос, а рейтинг со звездочками. Думаю сделать как я описал во втором варианте (см. в начале темы), чтоб не загромождать таблицу. Но будут ли какие подводные камни?
     
    #4 ghostcom, 2 июн 2017
    Последнее редактирование: 2 июн 2017
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    две таблицы
    первая - сущности, текущее значение рейтинга
    вторая - человек, сущность, цифра рейтинга

    при голосовании пишешь/обновляешь (см. insert ... on duplicate key update) запись во второй таблице, пересчитываешь рейтиг по данным всех голосов по этой сущности во второй таблице, пишешь результат в первую

    это будет работать быстро и хорошо, потому что большинство запросов будут только к первой таблице только на чтение.
     
    ghostcom нравится это.
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Первый вариант - полное Г. Не стоит использовать.
    Две ячейки. "Средний рейтинг" и "кол-во голосов".
    Достаешь, добавляешь 1 голос, пересчитываешь, обновляешь.
     
    ghostcom нравится это.
  7. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Если требуется хранить голоса пользователей отдельно то хранить отдельно, если требуется хранить только агрегированное значение значит нужно хранить только его. Если и первое и второе, то оба.
    Вы начинайте с того что сформулировали бизнес-задачу и понимаете что вам нужно получить.
     
    ghostcom нравится это.
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    хранить среднее это значит голосовать только один раз и не поменять потом никогда ничего
    плюс знать кто за что голосует обычно полезно для развития проекта
     
    ghostcom нравится это.
  9. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Тк будет реализована возможность голосовать не зарегистрированным пользователям нужда в таблице с юзерами отпадает. Только временное хранения IP в куки. Значит остается одна таблица с одной обновляемой записью. Колонки: ItemID, Общее кол-во голосов и Среднее значение.
    А будут ли конфликты при одновременном обновлении или в MySql это как то продумано?
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    тогда твоё голосование превратится в фарс в первый же день
    --- Добавлено ---
    атомарные операции не порождают конфликтов
    например:
    UPDATE `table` SET `field` = `field` + 1
     
    ghostcom нравится это.
  11. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    А если у меня нет пока зарегистрированных пользователей и будут ли они вообще)

    Понял. Спасибо!
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    собирай тупо лайки
    нафик тебе звёзды
    звёзды это сложно
     
  13. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Лайки вяленько! Нужно оценивать музыку. Да и сложного вроде ничего нет. Поэтому сам и пишу, потому что в плагинах через чур все заморочено. Так сказать на все случаи жизни. А под конкретный проект можно и попроще написать.
    --- Добавлено ---
    У меня все почти готово, осталось к базе прикрутить.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    если оценивать музыку, то надо регу
    чтобы можно было потом подсовывать "вам понравится" ещё музыку
    сделай возможность голосовать если вошел через вк
     
    ghostcom нравится это.
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    есть вероятность, что технически подкованный говнорэпер зальет записанный на телефон трэк, напишет маленький скриптик, выключит куки и через setInterval() накрутит себе 50к голосов с максимальным рейтингом :)
     
    denis01 нравится это.
  16. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Я пока со сторонними API не совсем дружу. Месяц PayPal прикручивал.
    Основа только на прослушивании, ни кто ни чего заливать не будет. Кроме владельца.
     
    denis01 нравится это.
  17. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    а то, что такое в принципе можно провернуть забавы ради для любого трэка, не смущает?
     
  18. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Ок, поразмыслил и решил делать как сказал igordata
    и вот эта хорошая идея
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    всё, пиши пропало :)

    лучше подумай о том, как сделать процесс регистрации необременительным. как бы невзначай.
     
  20. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Я подумал, голосование будет для зарегиных. Потом буду делать регистрацию через соц сети.