Ответы пользователя по тегу MySQL
  • Как правильно проводить "раскопки" сложной структуры БД на крупном проекте?

    В целом - создать несколько схем. Обычно работает примерно такая последовательность действий:

    0. Начать с пустой глобальной схемы.

    1. Внести в неё только названия таблиц. Разделить таблицы на основные бизнес-сущности, элементы агрегатов, справочники, таблицы связи и т. п. Чёткого алгоритма нет, интуитивно всё, глядя не только на схемы таблиц, но и на сами данные (если за пять лет работы в таблице 10 значений, то скорее всего это справочник), приложение, статистику СУБД и т. д.

    2. Добавить в таблицы на схеме первичные и внешние ключи. Очень поможет, если есть основания полагать, что все внешние ключи реализованы средствами СУБД.

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

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

    5. Детализировать по мере необходимости, если анализ делается для себя. Сразу, если для внешнего потребления.
    Ответ написан
    Комментировать
  • Что лучше - один запрос с двумя JOIN или три запроса?

    В общем случае лучше один. Начинать нужно с него. Когда он начнёт тормозить, то только тогда начинать профилировать, смотреть планы запросов и начинать оптимизировать. Преждевременная оптимизация - зло.
    Ответ написан
  • Хранение сложной структуры в mysql. Как?

    Сначала напишите на PHP в каком видите вы хотите работать с данными (иерархию объектов, вложенность массивов и т. п.), прикиньте как будете расширять «поля» при необходимости, чтобы не ломать весь код), и только потом думайте как это отобразить на БД. Хотя бы потому что одни и те же отношения между сущностями PHP можно реализовать в БД разными способами, например наследование (от абстрактного «коммента» наследуются «вопрос» и «ответ») отображается минимум тремя способами, а создавая их на основе базы можно просто не заметить, что имеет место какое-то удобное и понятное отношение.

    Абстрагируясь от схемы БД вы можете инкапсулировать работу с ней в функции/методы типа $answers = get_answers($question_id) или $answers = Answer.getByQuestion($question) и в них привязывать любую схему БД, или вообще не схему и не БД. Поменяете схему — нужно будет поменять только эти реализации, не трогая основную логику, в ней так и будете обращаться к названию фильма как $questions[$question_id]['answers'][0]['films'][0]['name'] или $questions[$question_id].answers[0].films смотря предпочтётё вы хранить сушности в массивах или объектах.
    Ответ написан
    Комментировать
  • Существуют ли framework'и для PHP вроде 1С?

    Большинство (перестраховка) популярных фреймворков имеют тот или иной вид ORM, позволяющий не задаваться (почти) вопросом где и как хранятся данные. Так же как имеют более-менее развитые средства работы с формами или даже генерации CRUD-интерфейсов. Отчёты — шаблонизаторы или сам PHP.

    Чисто субъективно для бизнес-приложений посоветовал бы присмотреться к Symfony2(+Doctrine2+Twig). По-моему там сильнее всего идёт разделение бизнес-логики, представлений и логики приложения (роутинг, хранение и т. п.).
    Ответ написан
    Комментировать
  • Неверная временная зона в MySQL?

    Хм, та же версия OS и MySQL, но всё нормально — system_time_zone выдаёт MSK.

    Вот tzdata другой
    apt-cache policy tzdata
    tzdata:
    Установлен: 2011k-0squeeze1
    Кандидат: 2011k-0squeeze1
    Таблица версий:
    *** 2011k-0squeeze1 0
    500 mirror.hetzner.de/debian/packages/ squeeze/main amd64 Packages
    500 ftp.uni-bayreuth.de/linux/Debian/debian/ squeeze/main amd64 Packages
    100 /var/lib/dpkg/status

    Теперь даже как-то страшно будет обновляться :-/
    Ответ написан
  • Хранимые процедуры mySQL: преимущества и недостатки

    Хранимые процедуры и триггеры плохо поддерживаются универсальными ORM. Видимо из-за больших различий в разных РСУБД. Вот когда (если?) научатся транслировать DSL модели в конкретный диалект SQL и синхронизировать изменения с БД (а для «примитивных» — реализовывать на «обычном» ЯП), тогда и обретут второе дыхание.
    Ответ написан
    Комментировать
  • Контроль версий базы данных (сайта)

    Вроде как Drupal из коробки поддерживает версионирование нод.
    Ответ написан
  • Типы полей в MySQL?

    Под name использовать 25 в случае utf-8 имхо не самая лучшая идея, даже если ограничиться русским, на мыло 50 тоже может не хватить в извращенных случаях, но соответствующих rfc (домены.рф например :) ). Да и вообще никакого оверхеда между varchar(1) и varchar(256) нет, смысла экономить не вижу, если в требованиях есть ограничения, то проверять их в приложении и именно на количество символов, а не байт (для php — mb_strlen(), а не strlen() ).
    Ответ написан
    2 комментария
  • Нужен совет по организации таблицы (MySQL, MyISAM)

    Сложность выборки для первого варианта (да и для остальных, кроме последнего) можно обойти введением булевого поля HAS_ATS
    Ответ написан
  • Тормозит mysql_connect();

    Версии клиента и сервера совпадают?
    Ответ написан
    Комментировать
  • Плюсы пересборки ядра?

    Мой опыт показывает, что если вопрос ставится так, то не нужно, а скорее всего будет только хуже :) Проверено и не раз, что пересборка ради пересборки (читай — ради понтов: «я тру-линуксоид»), без особого понимания что изменяемые параметры компиляции изменят, профита не приносит, а проблемы создаёт на равном месте (самая простая из них сложность с автоматическим обновлением).
    Ответ написан
    Комментировать
  • MySQL - Синхронизация нескольких потоков

    LOCK TABLES ххх WRITE;
    SELECT COUNT(*) FROM xxx WHERE x IN (x1,x2,x3,x4,x5,x6…… x1000);

    INSERT INTO xxx ...;
    UNLOCK TABLES;

    Заблокирует таблицу для других сессий. Если в запросах между блокировкой и разблокировкой будут использоваться на чтение другие таблицы например WHERE x IN (SELECT * FROM xxx1), то их тоже надо, если не ошибаюсь блокировать: LOCK TABLES ххх WRITE, xxx1 READ
    Ответ написан
    Комментировать
  • PHP, MySQL. антиповтор

    Приводить в одну «нормальную» форму: отбросить мусор (знаки препинания, например), преобразовать в один регистр, развернуть сокращения (или наоборот, свернуть в них)отсортировать слова по алфавиту
    Ответ написан
    Комментировать
  • Поменять местами 2 строки в таблице mysql

    UPDATE table SET priority=IF(priority=1, 2, 1) WHERE priority IN (1,2) — меняет местами order 1 и 2. order не должно быть уникальным, иначе 3 запроса.
    Ответ написан
    1 комментарий
  • Как сортировать внутри GROUP BY?

    >тоесть цены выбирает верные, но ид номера никак не соответствует ценнику, должно быть так

    Собственно по другому и не должно быть — группируете по стране, выбираете максимальную цену и выводите «рандомный» номер, нигде не указывая, что он должен соответствовать этой цене. Так или иначе нужно сначала получить максимальное значение, а потом номер для него.
    Ответ написан
    Комментировать
  • Стоит ли использовать Mongo?

    Вообще, имхо, связи многие-ко-многим не являются сильной стороной Mongo (да и других NoSQL БД, с которыми знаком). Наиболее эффективно они работают со встроенными объектами, то есть связями один-к-одному и односторонними один-ко-многим.
    Ответ написан