Эффективное взаимодействие базы данных с трекером / персистером - PullRequest
1 голос
/ 06 июня 2011

Допустим, у меня есть метод класса с именем ->saveAll(). Этот класс отслеживает объекты, которые должны быть помещены в базу данных. (Как то, что делают учения)

Какой эффективный способ сохранить эти объекты? Вот о чем я сейчас думаю (я собираюсь использовать MySQL в качестве примера):

  1. Открыть соединение с MySQL.
  2. Выполнить цикл для всех объектов.
  3. Проверьте, какое свойство изменилось.
  4. Выполните запрос с помощью UPDATE или INSERT.
  5. Когда цикл заканчивается, соединение закрывается.

Это лучший способ сделать это? Или есть лучший способ сделать это?

Также, скажем, если я хочу ->saveOne($object). Будет ли хорошо следующее:

  1. Открытое соединение
  2. проверить наличие изменений
  3. выполнить запрос
  4. закрыть соединение

1 Ответ

1 голос
/ 06 июня 2011

Если ваша таблица имеет первичный ключ или уникальный индекс, вы можете использовать оператор REPLACE со всеми вашими данными сразу:

REPLACE INTO foo (id, bar) VALUES (NULL, 'baz'), (1, 'hello');

Строка будет вставлена, если она имеетне существует или если первичный ключ / уникальный индекс не указан.Если первичный ключ или уникальный индекс найден, он будет обновлен.

Кроме того, когда MySQL выполняет UPDATE (или когда он обновляется через REPLACE), он проверяет каждое значение, чтобы увидеть, изменилось ли оно автоматически(без необходимости делать это самостоятельно) и оставить все как есть, если нет, без каких-либо дополнительных операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...