ORM очень широко используются в реальных приложениях. Упомянутая вами проблема изменения схемы обычно решается одним из двух способов:
Как указывалось в предыдущих ответах, вы можете поддерживать схему вручную в базе данных и заставить ORM обновить свою схему, чтобы она соответствовала тому, что она видит в базе данных.
Вы можете заставить ORM проверить схему базы данных на основе собственной информации об объектной модели и сгенерировать необходимые запросы для обновления в случае каких-либо изменений.
По моему опыту, любой приличный ORM должен быть в состоянии справиться с # 1, и большинство, похоже, сможет справиться с # 2, но это не так универсально.
Что касается того, что лучше, хорошо ... Это во многом зависит от того, как вы видите отношения между вашей базой данных и вашей объектной моделью.
Если ваш основной интерес связан с базой данных, и вы используете ORM для обеспечения OO-оболочки вокруг таблиц и полей, чтобы сделать их более доступными, то вам, вероятно, захочется перейти к # 1 и сохранить полный контроль над базы данных.
Если, с другой стороны, вы рассматриваете объектную модель как высшую и в основном используете базу данных в качестве механизма тупого постоянства, а ORM служит для упрощения этой задачи, то вам, вероятно, захочется использовать № 2, чтобы вы может сосредоточиться на объектной модели и не беспокоиться о деталях базы данных. Или вы можете захотеть взглянуть на хранилища ключей / значений, механизмы сохранения графов объектов или другие формы баз данных NoSQL, чтобы получить лучшую поддержку для простого сохранения объектов, не беспокоясь об изменениях схемы на стороне базы данных вообще.