Ответы пользователя по тегу Базы данных
  • Зачем нужна схема данных в access?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Вообще-то в MySQL кроме "просто соединяю через JOIN" есть ещё "внешние ключи" (foreign key), определяющие связи между таблицами (те самые, задаваемые ER-моделью) и обеспечивающие автоматический контроль целостности данных.

    ER-модель нужна для того, чтобы описать предметную область. И построение ER-модели - это начальный этап проектирования базы данных. А уже из готовой ER-модели автоматически генерируется структура таблиц БД (что делается не самой СУБД, а отдельными утилитами).

    Access - это мешанина из собственно СУБД и визуальных средств управления этой СУБД. А MySQL - это только СУБД. Потому MySQL не содержит встроенных механизмов работы с ER.

    Если работать с MySQL только в phpMyAtmin, то, разумеется, с ER не столкнёшься. Но более приличные программы администрирования MySQL содержат механизмы работы с ER.
    Ответ написан
    Комментировать
  • Как правильно составить алгоритм?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Из множества строк первой таблицы вычитаем множество строк второй таблицы и результат записываем в третью таблицу. В MySQL это делается единственным SQL-запросом INSERT ... SELECT. Но так как в MySQL не реализована SQL-команда EXCEPT (разность множеств), то используется её эмуляция стандартным приёмом (описываемом в любом учебнике) через LEFT JOIN и IS NULL:

    INSERT INTO table3
    SELECT table1.*
    FROM table1
    LEFT JOIN table2
      ON table1.id = table2.id
    WHERE table2.id IS NULL
    Ответ написан
    Комментировать
  • Как сделать экпорт в кодировке utf8 из большой БД MySQL с помощью mysqldump?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Возьми любую систему управления MySQl - от PhpMyAdmin до dbForge Studio for MySQL - и делай дамп ей.

    А если у тебя в БД триггеры есть, то dbForge Studio создаст дамп, который будет с этой стороны совершенно безопасен (никаких повреждений данных от сработавших во время восстановления триггеров).
    Ответ написан
    1 комментарий
  • Каким образом организовать хранение большого количества записей в БД?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Проще переехать на любую нормальную SQL-базу (начиная с MySQL) с индексами для столбцов идентификатор и e-mail. Там такие запросы будут выполняться быстро.
    Ответ написан
    3 комментария
  • Стоит ли в MySQL разделять таблицы по разным БД?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    В MySQL (к другим СУБД это не относится) в запросе возможно указать базу данных. Более того, в одном запросе может быть обращение к таблицам разных БД. Разумеется, если все они работают на одном сервере.

    Т.е. безо всяких дополнительных соединений можно сделать:

    INSERT INTO base1.table1 (field2) SELECT base2.table2.field2 FROM base2.table2;

    Таким образом, никаких проблем с разделением таблиц по нескольким базам нет. И несколько соединений тоже не требуется.

    Если же базы будут работать на разных серверах, то да - понадобится по одному соединению на сервер. Что тоже проблем не вызовет.
    Ответ написан
    Комментировать
  • Как организовать базу данных?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Применительно к структуре таблиц, предложенной sayber: добавь в questions поле count типа int со значением по умолчанию 0, а на таблицу answers (должна быть InnoDB) повесь триггеры:

    DELIMITER $$
    
    CREATE DEFINER = 'root'@'%' TRIGGER answers_after_insert
    AFTER INSERT ON answers FOR EACH ROW
    BEGIN
      UPDATE questions
      SET questions.count = questions.count + 1
      WHERE questions.question_id = NEW.question_id;
    END
    
    $$
    
    CREATE DEFINER = 'root'@'%' TRIGGER answers_after_delete
    AFTER DELETE ON answers FOR EACH ROW
    BEGIN
      UPDATE questions
      SET questions.count = questions.count - 1
      WHERE questions.question_id = old.question_id;
    END
    
    $$
    
    DELIMITER;


    В этом случае поле questions.count автоматически будет содержать точное кол-во ответов на вопрос и фильтрация/сортировка по кол-ву ответов становится тривиальной.
    Ответ написан
    Комментировать