Помогите с логикой

Discussion in 'PHP' started by dnnov, 23 Jan 2011.

  1. dnnov

    dnnov New Member

    Joined:
    12 Jun 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Ребят перед нами база mysql

    id login pass ochered
    100 fazzz ****** 0
    101 kuku ****** 44
    102 mamuk ****** 37
    103 loff ****** 38
    .....

    История есть куча пользователей у каждого есть ID LOGIN PASS и ОЧЕРЕДЬ. Очередь имеют только люди которые онлайн. Например в базе 1000 пользователей из них 150 в онлайне. Пользователь Infiniti добавляется в онлайн строчка в базе с очередью у него 151 (по условию) а вот если пользователь KUKU уйдет с сайта его ячейка где написано 37 станет нулем. Как реализовать чтобы все с 38 по 151 очередь свою очередь понизили на единицу.
    Я понятно расписал??? Прошу ребят помогите! всю голову изломал!

    Необходимо реализовать используя PHP + Mysql (поменьше нагрузки на БД)
     
    #1 dnnov, 23 Jan 2011
    Last edited: 23 Jan 2011
  2. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    Вообще,каждый раз шевелить всю таблицу не самый хороший вариант, но,раз просишь (удаляется юзер с очередью 44 в примере)



    DELETE <ЮЗЕР С ОЧЕРЕДЬЮ 44>
    UPDATE <ИМЯ ТАБЛИЦЫ> SET ochered=ochered-1 WHERE ochered>43

    ИМХО, правильнее делать выборку юзера с минимальным значением ochered - меньше нагрузка на базу будет
     
  3. dnnov

    dnnov New Member

    Joined:
    12 Jun 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    можете оформить в виде php кода?
     
  4. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    Первый вариант и так "почти код", а для оформления второго желательно знать некоторые тонкости о проекте, в частности, о предполагаемой нагрузке - исходя из этого логика может быть разной.

    В общем,основная идея понятна, но вот может передумаешь над реализацией такого метода "очереди"?

    Смотри, если тебе надо добавить новое значение в очередь,тебе придется либо:
    а.Использовать автоинкремент и задуматься над тем,как избежать переполнения счетчика - это чуть быстрее,но реализация механизма контроля переполнения счетчика потребует усилий, плюс на время,пока база в "обслуживании" придется приостановить с ней работу(добавление новых записей в таблицу - точно).
    б.Каждый раз вычислять максимальное значение самому - это позволит избываться от механизма контроля за переполнением счетчика,но даст еще дополнительную нагрузку на сервер - тоже не хороше, хотя лучше чем вариант (а).

    Оба варианта ,плюс ко всему, создадут совсем ненужную нагрузку на сервер.

    Попробуй так - выдели поле, в которе записывай максимально точно ВРЕМЯ запроса на обслуживание, плюс поле для отметки обслуженных/выбывших клиентов. Потом останется просто выбирать одну запись с минимальным временем,у которой не установлена отметка "обслужен/выбыл" - это будет правильнее ИМХО.
     
  5. dnnov

    dnnov New Member

    Joined:
    12 Jun 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Итак максимальное кол-во зарегистрированных пользователей 100 человек(больше быть не может). Редко в онлайне более 30. Приведенная выше таблица из БД имеет название user

    есть также другая таблица с наименованием temp куда в некоторую ячейку zzzz я записываю число максимально достигнутой очереди. Т.е если логинится пользователь т.е станет онлайн - значение zzzz +1 если же кто-то офлайнится zzzz -1.

    каждый пользователь выполняет задание! После выполнения которого переводится на последнее место в очереди. Задания каждым пользователем выполняются примерно 1 раз в 15- 30 минут. т.е за это время очередь успевает сделать круг. т.е очередь меняется примерно 1 раз в минуту.

    Предлагаемый вами вариант про приостановление работы не подходит! ведь очередь меняется очень быстро.... А про автоинкремент я непонял!!! есть еще мысли????




    в итоге имеем 3 случая когда нам необходимо редактировать очередь:

    1. выход пользователя в онлайн
    {
    это легко
    }
    2. уход в оффлайн
    {
    ломаю голову
    }
    3. уход в конец очереди после выполнения задания
    {
    вытекает из второго
    }
     
    #5 dnnov, 23 Jan 2011
    Last edited: 23 Jan 2011
  6. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    При таком количестве пользователей о нагрузке на сервер точно не стоит ломать голову.

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

    Таблица temp не нужна - достаточно запроса SELECT max(ochered) FROM user - и на руках максимальное значение (последнего) номера в очереди - это немного упростит логику работы.

    Для уменьшения у всех пользователей в таблице значения поля ochered проще воспользоваться запросом UPDATE user SET ochered=ochered-1 (это в случае выполнения задания)

    Для дисконнекта два запроса
    DELETE FROM user WHERE ochered="номер в очереди выбывшего юзера"
    UPDATE user SET ochered=ochered-1 WHERE ochered>"номер в очереди выбывшего юзера"

    Лучше постучи в асю - помогу с этим
     
    #6 Steam[777], 23 Jan 2011
    Last edited: 23 Jan 2011
    3 people like this.