Когда вставлять или обновлять с помощью составных моделей первичных ключей в ORM? - PullRequest
0 голосов
/ 27 октября 2009

У меня есть домашняя система ORM, которая в настоящее время поддерживает только автоинкрементные первичные ключи. Это сработало хорошо, но пришло время поддерживать составные первичные ключи. Я знаю о священной войне между суррогатом против составных первичных ключей, и я лично думаю, что есть место для каждого. Во всяком случае ...:)

С автоинкрементным первичным ключом легко определить, нужно ли выполнять оператор INSERT или UPDATE при сохранении модели: это зависит от того, установлен первичный ключ или нет.

Но с (не-автоинкрементными) составными первичными ключами трудно сказать, так как вам нужно установить все значения полей составного первичного ключа, даже если вы делаете INSERT.

Итак, на мой вопрос: как определить, нужно ли выполнять оператор INSERT или UPDATE при работе с составным первичным ключом?

Вот решения, которые я придумала:

  1. Запрос заранее, существует ли запись с составным первичным ключом. Это кажется лучшим вариантом, хотя при каждом сохранении необходимо выполнять дополнительный запрос.
  2. Использовать синтаксис MySQL INSERT ... ON DUPLICATE KEY UPDATE. Но есть другие операции, которые выполняет мой класс Model, которые требуют знания, является ли запись новой или нет, например, проверять ли все столбцы (если запись новая) или только измененные столбцы (когда запись уже существует).

У вас есть лучшее решение? Или один из них мой лучший выбор? Спасибо за понимание!

Ответы [ 3 ]

1 голос
/ 27 октября 2009

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

Третий вариант - позволить пользователю решать и обрабатывать ошибки, предоставляя в вашем ORM методы Create () и Update (), рассчитывая на СУБД с ошибкой с повторяющимся ключом, если вы создаете (), когда это необходимо не имеет.

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

0 голосов
/ 27 октября 2009

Если мне придется использовать ваш инструмент, я бы хотел, чтобы это поведение (и поведение, используемое другими OR / M):

  1. Сохраняйте свойство IsNew в ваших классах. Когда вы выбираете данные, установите для этого свойства значение false. Когда пользователь создаст новый класс, установите для него значение true.

  2. Когда приходит действие сохранения, теперь вы знаете, выполнять ли INSERT или UPDATE на основе этого свойства ( IsNew ).

Преимущества:

  • Нет дополнительных запросов.
  • Если пользователь хочет выполнить обновление без предварительной выборки данных, вы можете сделать это свойство общедоступным, чтобы они могли установить IsNew = false , тогда произойдет обновление.
  • Не имеет значения, есть ли у вас отдельные или составные ПК, автоинкрементные столбцы и т. Д.
0 голосов
/ 27 октября 2009

Я полагаю, вы можете использовать REPLACE или использовать

"ВСТАВИТЬ ... НА ДУБЛИКАТЬ КЛЮЧЕВОЕ ОБНОВЛЕНИЕ", как вы сказали ... вот кое-что, что может помочь из руководства.

С ON DUPLICATE KEY UPDATE, значение строки в каждой строке равно 1, если строка вставляется как новая строка и 2 если существующая строка обновлена.

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