Я думаю, что ответ на этот вопрос зависит от доступных технологий для языка, который вы собираетесь использовать.
Я, например, очень успешно использую ORM (NHibernate), поэтому, естественно, я могу порекомендовать первый вариант.
Есть и другие варианты, которые вы можете выбрать, хотя:
- Если вы используете .NET, вы можете использовать атрибуты для своих свойств класса, чтобы они служили либо как отображение внутри класса, либо как данные, которые могут быть отражены
- Если вы используете .NET, Fluent NHibernate значительно упростит создание безопасных для типов отображений в вашем коде.
- Вы можете использовать непатентованные средства, чтобы вам не нужно было создавать контроллер для каждой таблицы, хотя я допускаю, что, скорее всего, вы все равно будете делать последнее. Тем не менее, дженерики могут содержать большинство общих методов CRUD, которые являются общими для всех таблиц, и вам нужно будет только кодировать определенные причуды.