Я бы определенно выбрал вариант 2, попытайтесь определить минимальное количество операций, которое вам нужно выполнить.
Однако вполне нормально возвращаться к варианту 1 во время крайних сроков и т. Д., Поскольку его немного проще реализовать.
Однако не должно быть намного сложнее выяснить, что это за изменения, так как мне не кажется, что вы сами меняете строки. Либо вы удаляете те, у которых помечена галочка, либо вставляете те, у которых установлена галочка.
Просто сохраните список значений первичного ключа того, что находится в базе данных, а затем сравните с этим списком, когда вы выполняете итерацию по новому списку, когда пользователь хочет сохранить изменения.
Минимальное рабочее решение здесь также будет означать, что вы будете более ориентированы на будущее с точки зрения рефакторинга, изменений или дополнений. Например, что если в будущем появятся данные, прикрепленные к любой из этих строк. Вы должны были бы сохранить это также. Как правило, я немного против написания кода ради «что если», но здесь я чувствую, что это больше похоже на «почему бы вам не ...», чем это.
Так что я советую перейти к варианту 2. Не намного больше работы.