Нужно всегда следовать спецификации HTTP, если вы используете HTTP, и причина в том, чтобы просто позволить людям, которые разбираются в спецификации, правильно функционировать .
412 следует использовать только в том случае, если предварительное условие (например, If-Match) вызвало сбой при сопоставлении версии, тогда как 409 следует использовать, если объект вызовет конфликт ( Сама спецификация HTTP ссылается на это поведение в определении 409 ).
Следовательно, клиент, который не отправляет ETag, не будет ожидать 412. И наоборот, клиент, который отправляет ETag, не поймет, что это ETag вызывает 409.
Я бы придерживался одного пути. Вы говорите, что «схема базы данных не может измениться», но это не мешает вам (прямо на уровне HTTP-сервера) извлечь версию из представления базы данных и поместить ее в ETag, а затем на пути, возьмите заголовок If-Match и поместите его обратно в поле версии.
Но делать это полностью в самом теле сущности не запрещено. Вам просто нужно объяснить концепцию и то, как она работает, тогда как с помощью решения ETag вы можете просто указать людям на спецификацию HTTP.
Редактировать: И флаг версии не обязательно должен быть хешем текущего ресурса; версия вполне приемлема. ETag: "3"
- это совершенно правильный ETag.