Невозможно сказать, является ли конкретный дизайн базы данных плохим, не зная, что делает приложение, форма данных, ожидания производительности и так далее. Хотя обычно нормализация (в некоторой степени) считается наилучшей практикой, довольно часто денормализуют области баз данных по соображениям производительности, поэтому хорошие и плохие очень открыты для обсуждения без большого количества данных, чем у большинства людей в начале.
Добавьте к этому множество подходов, которые можно использовать для возражения на реляционные отображения, и все станет еще сложнее, поскольку «лучшая» структура базы данных будет зависеть от конкретной объектной модели, уровня наследования и так далее.
Принимая один размер, подходящий для всех подходов, библиотеки персистентности ORM почти всегда будут создавать неоптимальную структуру базы данных для любой конкретной ситуации и будут использовать некоторые вещи, которые можно рассматривать как плохую практику для данной конкретной ситуации .
Вы, конечно, могли бы написать ORM, который нормализовал бы, но вы бы увидели довольно здоровенные последствия для производительности, так как для каждой вставки в основную таблицу нужно было сканировать различные справочные таблицы, чтобы увидеть, существуют ли значения, получили ли они свои ключи и не сделали ли они. не выполняйте соответствующие вставки.
(Когда вы делаете это вручную, вы можете сократить некоторые из них, так как знаете, что представили их с выпадающим списком, содержащим только допустимые значения, поэтому вам не нужно делать эти поиски, вы можете просто использовать ключ, довольный тем, что он работает чтобы быть действительным, ORM не мог сделать такое предположение, поскольку он не контролирует пользовательский интерфейс.)
Но вы должны помнить, что они не стремятся оптимизировать производительность базы данных или целостность данных, они оптимизируют скорость разработки . Если конкретная структура ваших данных важна для вас, то вам нужно либо вручную написать код отображения вашего объекта / СУБД, либо, по крайней мере, провести детальную оценку всех доступных библиотек и выбрать ту, которая наиболее соответствует вашим потребностям ( если таковой существует).
По сути, это сводится к требованиям и компромиссу между хорошо структурированными данными, производительностью базы данных и скоростью разработки. Как и во многих компромиссах, вы не можете выбрать все три.