Ответы пользователя по тегу MySQL
  • Как реализовать отчёт по продажам с меняющейся иерархией?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Как специалист по Монге скажу - Монга тут ненужна.

    Отчет, как правило, вещь относительно статичная. В нормальном виде генерируется ввиде файла, обычно Excel и т.д.
    Если ваш отчет генерируется на лету, то нужно менять подход к написанию кода и предоставлять обратную совместимость. Реализуется это за счет правильного выбора структур данных и миграций (трансформации старых данных в новые, с поддержкой совместимости).

    Есть альтернативный вариант с созданием снапшотов, т.е. просто делается копия сгенерированной HTML страницы со всеми встроенными данными и скриптами. Подход не очень красивый, но реализуется быстрее остальных.

    Кстати, ничего не мешает вам делать снапшоты для Nested Sets и хранить их в отдельной таблице в виде леса деревьев.
    Ответ написан
    Комментировать
  • Как реализовать статус "просмотрено" в чате (напротив сообщений)?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Добавить третью таблицу - message_status.
    В ней хранить message_id, user_id и read_at в виде nullable timestamp.
    В интерфейсе чата контролировать сообщения попадающие в видимую область и отслеживать событие прокрутки.
    Сохранять статус сообщений в модели на клиенте и периодически отправлять эти обновления на сервер в фоне и по page unload если что-то осталось.
    Ответ написан
    Комментировать
  • Как спланировать БД (чат)?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Итак, что вам нужно. Предполагается, что у вас есть табицы user и group.

    Таблица со списом чатов

    chat
    	id - идентификатор чата
    	name - название чата (тема обсуждения)
    	user_id - идентификатор  пользователя, который создал чат (необязательно)


    Список участников чата
    roster
    	chat_id - идентификатор чата
    	user_id - идентификатор пользователя
    	group_id - ид группы, если пользователь пишет от имени группы или NULL, если от пользователя (можно даже держать 2 записи, где group_id = null и где нет)


    Список сообщений
    messages
    	id - идентификатор сообщения
    	chat_id - идентификатор чата
    	user_id - ид пользователя
    	group_id - ид группы, если сообщение отправлено от имени группы или NULL, если от пользователя
    	text - текст сообщения


    Статусы сообщений
    message_status
    	message_id - идентификатор сообщения
    	user_id - идентификатор пользователя
    	read - прочтено или нет
    	notified - отправлено уведомление о сообщении или нет


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

    В данной схеме сценарий "Пользователь2 пишет в Группа1" выглядит так.
    Создается чат, далее в ростер добавляются П2 и Г1. Далее просто создается сообщение от имени П2. Через бизнес-логику находится владелец Г1 и ему отправляется уведомление.
    Ответ написан
    Комментировать
  • Работа с mysql в node.js В чём заключается подвох?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Судя по всему нет подключения к базе. Посмотрите скринкасты https://learn.javascript.ru/screencast/nodejs Там все очень понятно рассказано.
    Ответ написан
  • Как импортировать большую базу данных в mysql innobd - 87Gb?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Налицо проблема перестроения индекса.

    Следующие операции делаем внутри одной сессии с mysql.
    Mysql-клиент можно запустить внутри screen сессии, чтобы не бояться отвала терминала.
    Сначала делаем так:
    SET autocommit=0; 
    SET unique_checks=0; 
    SET foreign_key_checks=0;

    Затем вставляем, используя вставку со множество значений
    INSERT INTO yourtable VALUES (1,2), (5,5), ...;
    Теперь необходимо закоммитить транзакцию
    COMMIT;
    И вернуть настройки назад.
    SET unique_checks=1; 
    SET foreign_key_checks=1;

    Еще рекомендуется установить (необходимо полностью остановить сервер и запустить заново после изменения my.cnf)
    [mysqld]
    innodb_read_io_threads = 64
    innodb_write_io_threads = 64
    innodb_io_capacity = 5000
    innodb_autoinc_lock_mode =2
    innodb_open_files=32768
    Ответ написан
    2 комментария
  • Какая база луче подойдет на рабочий портал?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Возьмите MongoDB. Не будет проблем с масштабируемостью и производительностью.
    Концепция сайта с вакансиями/позициями прекрасно ложится в NoSQL-хранилище.
    Ответ написан
    Комментировать
  • Как ускорить вставку, если много индексов?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Чтобы решить эту проблему, нужно выбросить MySQL и использовать колоночные СУБД, которые разработаны специально для таких задач.
    Смотрите в сторону Vertica, Cassandra, HBase.
    Ответ написан
    9 комментариев
  • Есть примеры как сделать realtime чат на ajax+php+mysql? Например Ajax Long Polling?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Не занимайтесь хренью. Используйте это socketo.me

    Еще можете на этот проект посмотреть www.swoole.com
    Ответ написан
    5 комментариев
  • Плохо ли создавать проекты с нуля? Что значит быть про?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Я понимаю, о чем вы пишите и почему. Ваш код работает, т.к. решает поставленные задачи и удовлетворяет потребности ваших клиентов. Имеет ли он право на жизнь? Да, но только в вашем отдельно взятом случае.

    Дело в том, что ваш код не гибок, в нем отсутствует масштабируемость, его невозможно поддерживать.

    Что если вам потребуется сделать блог, в котором нужно иметь комментарии, которые обновляются в режиме реального времени? И комментарии могут содержать HTML, но такой, чтобы ваш сайт не могли взломать?
    А еще комментарии короче 2000 символов по воскресеньям платные. Оплата через Яндекс.Деньги.
    Вы все это делаете, все работает.
    Затем заказчик вам говорит, я хочу запустить такую же систему другу, но с оплатой по понедельникам через WebMoney.
    Вы копируете сайт, переписываете функцию оплаты.
    Дальше ваш заказчик видит, что у друга больше денег, он просит добавить WebMoney к себе.
    Вы опять переписываете код. Добавляете условия.
    Потом к вам приходит друг заказчика и хочет другое оформление. Вы переписываете его функции.
    Затем он просит добавить поиск по названиям записей к себе на сайт. Вы делаете. Буквально на следующий день к вам приходит заказчик и тоже просит поиск, но не только по названиями, но и по телу статей и по комментариям. Вы делаете.
    Затем ваш заказчик видит, что дела у него идут в гору и он просит отменить платные комментарии и сделать просто платные аккаунты для всех. Вы переписываете.
    Тем временем друг просит вас сделать все тоже самое, но с его оформлением.
    Дела у заказчика идут в гору и сайт начинает тормозить. Вы делаете кэширование.
    Внезапно сайт заказчика попадает в топ и нагрузка резко увеличиваете настолько, что один сервер уже не справляется. Вы переносите все на самый мощный, но он его тоже мало.
    Нужно делать горизонтальное масштабирование.
    Для этого нужно переписать все функции, которые работают с базой данных. А их уже больше двухсот. И просто замена не подходит.
    Сайт открывается через раз, заказчик звонит вам каждые 2 часа и спрашивает, как там прогресс.
    И тут вам присылает письмо друг заказчика и говорит, что хочет перейти с MySQL на PostgreSQL.
    И вы понимаете, что вам надо будет переписать еще 300 функций, но на другом сайте. Вы его посылаете, поскольку вы и так в мыле.
    Друг жалуется на вас заказчику. Заказчик, не ставя вас в известность, нанимает другого исполнителя, у которого отваливается челюсть от того, что творится в системе. Он объясняет, что ему нужно будет потратить полгода, чтобы вникнуть в то, чтобы понять ваш код, но он может сделать все тоже самое за 4 месяца, причем для заказчика и его друга так, что это будет расширяемо и поддерживаемо не только им.
    Тем временем, спустя двое суток жизни на кофеине вы героически переписываете все функции заказчика и идете отсыпаться. После суток сна вы обнаруживаете на автоответчике сообщение, что вы уволены. А все потому, что забыли проверить функцию логина.

    А теперь разберем эту историю по частям. Почему же вас уволили?

    Незнание абстракций и шаблонов проектирования привело к тому, что вы вынуждены были поддерживать 2 разных проекта с практически одинаковой логикой.
    Например ORM смог вам помочь поддерживать 2 разные базы данных без каких-либо усилий. Сменить одну базу на другую стоило бы исправления конфигурации, а не переписывания 300 функций.
    Использование фреймворков позволило бы сократить время на реализацию подключений платежных систем. Многие из них имеют готовые реализации.
    Опять же в современных фреймворках, например в той же Doctrine реализован шардинг. В большинстве случаев ваши проблемы свелись к изменению настроек.
    Но даже если бы вы накосячили, то интеграционные тесты не позволили бы попасть говну в продакшен. А если бы оно и попало, ну накосячили вы с тестами тоже, то проблема была бы обнаружена на раннем этапе благодаря "сине-зеленому" развертыванию и она бы не затронула всех пользователей.
    И да, ваш код не прошел внешний аудит.

    Чтобы быть настоящим профессионалом, нужно не только знать, но и уметь применять на практике ООП, популярные фреймворки, шаблоны проектирования, тестирование и средства непрерывной интеграции, а еще пользоваться нормальными IDE и нести ответственность за сделанную работу.

    Когда пишете свой код, почаще задавайте себе вопрос: А если бы это был код для моего кардиостимулятора? Это поможет.
    Это вам для общего развития.
    Ответ написан
    5 комментариев
  • Как в таблице product лучше всего занести информацию по размерам для фильтра по товарам?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Лучше всего использовать SET, но можно и работать через таблицу связей. Зависит от того, что вы хотите получить в итоге.
    Ответ написан
  • Хорошая ли идея хранить переводы в JSON?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Я бы рекомендовал простую таблицу:

    locale_id
    content_id
    content_type
    content


    Далее отдельный скрипт, который выгружает базу в json файлы с именем locale_id.json и соотвествующей структурой внутри.
    Ответ написан
  • Как загрузить данные из файла на чужом сервере?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Вам нужно скопировать файл с другого сервера на ваш.
    Если файл очень большой, вы можете примонтировать том через NFS.
    Ответ написан
    Комментировать
  • Почему mysql обрывает соединение?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Да, использование пула соединений поможет вам избежать подобной проблемы.

    Рекомендуется также изменить размер количества одновременных соединений (max-connections) в настройках MySQL.
    Ответ написан
    2 комментария
  • Одна админ панель для всех сайтов, кто нибудь делал такое?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    В любой нормальной CMS есть такая опция - называется мультисайт.
    База обычно одна на все сайты.
    Просто у вас появляется дополнительная сущность - сайт.
    Ответ написан
  • Как реализовать мгновенные сообщения?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Используйте веб-сокеты для PHP socketo.me
    Ответ написан
    1 комментарий
  • На сколько наличие индексов замедляет insert MySQL?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    На такой вопрос нет однозначного ответа.
    В одном случае 10 индексов практически незаметно, а в другом и трех хватает, чтобы убить базу.
    Смысл прост - если вставки интенсивные (больше одной в секунду) и таблицы быстро растут, то старайтесь сводить количество индексов к минимуму.
    Помните, что вставка данных вызывает перестроение индекса. Это занимает время. Чем больше индексов, тем больше перестроений, чем больше строк в таблице, тем дольше перестроение индекса.
    Например, если у вас небольшая база и перестроение индекса будет занимать секунду, то два индекса могут занять две секунды, а десять - десять. Получается, если ваш веб-сервер ответит за секунду, то все ок, а если ему потребуется 10 секунд, то пользователь подумает, что сайт не открывается и закроет его.
    Ответ написан
    Комментировать
  • Регистрация на PHP?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    1. Используйте PDO.
    2. Никогда не подставляйте данные так, как вы это делаете.

    Вот образец того, как надо делать
    <?php
    // создаем соединение с базой данных
    $db = new PDO('mysql:dbname=phpreg;host=localhost;port=3306', 'rootdb', '123');
    
    // устанавливаем кодировку utf8, чтобы никогда не было крякозябр
    // создавайте таблицы и базы с такой же кодировкой
    $db->exec('SET NAMES utf8');
    
    if (isset($_POST['send'])) {
    
        // получаем значение параметра
        $login = $_POST['name'];
    
        // подготавливаем наш запрос
        $sth = $db->prepare('SELECT * FROM userdb WHERE login = :login');
    
        // связываем подстановку :login с переменной $login
        $sth->bindParam('login', $login);
    
        // выполняем наш запрос
        $res = $sth->execute();
    
        // если запрос выполнился успешно, то выбираем все данные в массив
        if ($res) {
            $result = $sth->fetchAll();
    
            // мы не нашли строку с пользователем
            if (empty($result)) {
                echo 'Пользователь не найден!';
    
            } else {
                // мы нашли пользователя
    
                // проверяем пароль на правильность,
                // используйте http://php.net/manual/ru/function.password-hash.php для создания хэша пароля
                // никогда не храните пароль в открытом виде!
                if (password_verify($_POST['pass'], $result[0]['password'])) {
                    // не используйте переменные из запросов для вывода
                    echo "Здравствуй, ". $result[0]['login'];
                } else {
                    echo 'Пароль неверный.';
                }
            }
        } else {
            // ошибка в запросе
        }
    }
    Ответ написан
    Комментировать
  • Проектирование схемы базы данных для системы сообщений?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Ответ написан
    Комментировать
  • Как правильно спроектировать MYSQL для чата на node.js?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Вы неправильно рассматриваете систему чатов.
    В чатах есть комнаты, внутри комнат сообщения и участники.
    Тет-а-тет это приватная комната с 2-ми участникам.

    room 
    - id
    - name
    - private
    
    participant (участник чата)
    - id
    - name
    
    roster (список участников чата)
    - room_id
    - participant_id
    
    history (история сообщений)
    - id
    - room_id
    - participant_id
    - timestamp
    - type (тип сообщения, иногда нужны системные сообщения от ботов)
    - text
    - deleted


    А теперь вперед - учить JOIN'ы!

    По поводу нагрузки - при правильном проектировании приложения, нагрузка на базу будет минимальной, преимущественно проверки, кто принадлежит к какой комнате и запись в историю.
    Сколько-нибудь значимая нагрузка будет при 10к человек онлайн. Поверьте, это очень большая посещаемость.
    При большей посещаемости ваша проблема будет решена горизонтальным масштабированием (шардингом БД).
    Ответ написан
    Комментировать