Ваш руководящий принцип должен звучать так: « Не повторяй себя» :
В разработке программного обеспечения «Не повторяйся сам» (DRY) - это принцип разработки программного обеспечения, направленный на сокращение повторения информации всех видов, особенно полезный в многоуровневых архитектурах. Принцип СУХОЙ гласит: «Каждая часть знаний должна иметь одно, однозначное, авторитетное представление в системе».
ORM - это, по сути, дополнительный уровень (или уровень, если вы предпочитаете), удобно расположенный между вашим приложением и хранилищем данных. Ваши ограничения должны быть в одном месте и только в одном месте, будь то ORM или хранилище данных, в противном случае достаточно скоро вы будете поддерживать разные их версии. Вы действительно не хотите этого делать.
Однако на практике большинство полуприличных ORM автоматически генерируют большую часть ваших моделей из вашей схемы данных. Хотя дублирование все еще существует, шансы на адское обслуживание минимальны, поскольку дублированный код ORM генерируется по одному и тому же шаблону каждый раз. Было бы идеально, если бы не было дублирующегося кода, но автоматически генерируемые ограничения - это следующая лучшая вещь.
Кроме того, наличие ограничений в одном месте не обязательно означает, что все ограничения должны быть в одном месте. Некоторые, такие как ограничения ссылочной целостности, могут быть более подходящими для хранения данных (но могут быть потеряны при переходе на другое хранилище данных), а некоторые, в основном те, которые касаются сложной бизнес-логики, больше подходят для вашего ORM. Было бы предпочтительнее иметь все свои яблоки в одной корзине, но ...
Отказы
Вы упоминаете, что ORM не работает. Это абсолютно не имеет отношения к вашему вопросу, ваше приложение должно воспринимать ORM и хранилище данных как единое целое. В случае сбоя произошел сбой, поэтому обходить ORM для непосредственного общения с хранилищем данных не очень хорошая идея.
В обход ORM для всего остального
Также не очень хорошая идея. Однако это может произойти по разным причинам:
Устаревшие части приложения, созданные до появления ORM.
Это жесткая один, и именно в такой ситуации я имею дело с прямо сейчас , поэтому моим постоянным повтором «поддерживающей ад». Либо вы продолжаете поддерживать части, отличные от ORM, либо переписываете их для использования ORM. Второй вариант может иметь больше смысла на начальном этапе, но это решение, основанное исключительно на том, что именно делают эти части вашего приложения, и насколько ценной будет полная перезапись в долгосрочной перспективе.
Попробуйте изменить ключ в плохо спроектированной таблице MySQL с 2 * 10 ^ 8 строками (без простоя), и вы поймете, откуда я.
Не унаследованные части приложения, которым абсолютно необходимо напрямую общаться с хранилищем данных:
Еще сложнее. ORM - это модные инструменты, и они заботятся почти обо всем, но иногда они просто мешают или даже абсолютно бесполезны. Модное слово (действительно, модная фраза) - это несоответствие объектно-реляционного импеданса , попросту говоря, технически ORM не может делать все, что делает ваша реляционная база данных, а для некоторых вещей, которые они делают, существует значительное снижение производительности.
Комментарии
С точки зрения целостности данных, ограничения ДОЛЖНЫ быть на базе данных, и ДОЛЖНЫ быть на приложении. Что делать, если доступ к вашему приложению осуществляется через веб-приложение и приложение для настольного компьютера, мобильное приложение или веб-сервис? - Луис Дамим
Вот где добавление дополнительного слоя было бы чрезвычайно полезно, и если мы говорим о веб-приложении, я бы пошел с REST API. Чрезмерно упрощенный дизайн для этого было бы:
ORM будет находиться между API и хранилищами данных, и все, что находится за API (включая его), будет рассматриваться как единое целое из различных приложений.