Правильный дизайн базы данных не похож на правильный дизайн объекта.
Если вы планируете использовать базу данных для чего-либо, кроме простой сериализации ваших объектов (таких как отчеты, запросы, многозадачное использование, бизнес-аналитика и т. Д.), Тогда я не рекомендую какого-либо простого сопоставления из объектов к таблицам.
Многие люди думают о строке в таблице базы данных как о сущности (я много лет думал об этом), но строка не является сущностью. Это предложение. Отношение к базе данных (то есть таблица) представляет собой некое утверждение о мире. Наличие строки указывает, что факт является истинным (и наоборот, его отсутствие указывает, что факт является ложным).
При таком понимании вы можете видеть, что один тип в объектно-ориентированной программе может храниться в дюжине различных отношений. А различные типы (объединенные наследованием, ассоциацией, агрегацией или полностью неаффилированные) могут быть частично сохранены в одном отношении.
Лучше спросить себя, какие факты вы хотите хранить, на какие вопросы вы хотите получить ответы, какие отчеты вы хотите генерировать.
После создания правильного дизайна БД очень просто создать запросы / представления, которые позволят вам сериализовать ваши объекты в эти отношения.
Пример:
В системе бронирования отелей вам может понадобиться сохранить тот факт, что Джейн Доу забронировала номер в гостинице Seaview Inn на 10-12 апреля. Это атрибут объекта клиента? Это атрибут отеля? Это объект бронирования с объектами, включающими клиента и отель? Это может быть любая или все эти вещи в объектно-ориентированной системе. В базе данных это не так. Это просто голый факт.
Чтобы увидеть разницу, рассмотрите следующие два запроса. (1) Сколько бронирований в отеле у Джейн Доу на следующий год? (2) Сколько номеров забронировано на 10 апреля в отеле Seaview Inn?
В объектно-ориентированной системе запрос (1) является атрибутом объекта клиента, а запрос (2) является атрибутом объекта отеля. Это объекты, которые выставляют эти свойства в своих API. (Хотя очевидно, что внутренние механизмы получения этих значений могут включать ссылки на другие объекты.)
В системе реляционной базы данных оба запроса проверяют отношение резервирования, чтобы получить их номера, и концептуально не нужно беспокоиться о какой-либо другой «сущности».
Таким образом, именно пытаясь хранить факты о мире, а не пытаться хранить сущности с атрибутами, создается надлежащая реляционная база данных. И как только он будет правильно спроектирован, тогда можно будет легко построить полезные запросы, о которых не мечтали на этапе проектирования, поскольку все факты, необходимые для выполнения этих запросов, находятся на своих местах.