Я программировал на C # и Java чуть больше года и неплохо разбираюсь в объектно-ориентированном программировании, но мой новый побочный проект требует модели, управляемой базой данных. Я использую C # и Linq, которые кажутся очень мощным инструментом, но у меня проблемы с проектированием базы данных на основе моего объектно-ориентированного подхода.
Мои два основных вопроса:
Что делать с наследованием в моей базе данных? Допустим, я создаю приложение для составления списка сотрудников и у меня есть абстрактный класс Event. От Event я получаю абстрактные классы ShiftEvent и StaffEvent. Затем у меня есть конкретные классы Shift (производные от ShiftEvent) и StaffTimeOff (производные от StaffEvent). Существуют и другие производные классы, но этого достаточно.
Должен ли я иметь отдельную таблицу для ShiftEvents и StaffEvents? Может быть, у меня для каждого конкретного класса должны быть отдельные таблицы? Оба этих подхода кажутся мне проблемными при взаимодействии с базой данных. Другой подход может заключаться в наличии одной таблицы событий, и в этой таблице будут столбцы, допускающие значение NULL, для каждого типа данных в любом из моих конкретных классов. Кажется, что все эти подходы могут помешать расширяемости в будущем. Скорее всего, есть третий подход, который я не рассматривал.
Мой второй вопрос:
Как работать с коллекциями и отношениями "один ко многим" объектно-ориентированным способом?
Скажем, у меня есть класс продуктов и класс категорий. Каждый экземпляр категорий будет содержать один или несколько продуктов, но сами продукты не должны знать категорий. Если я хочу реализовать это в базе данных, то каждому продукту потребуется идентификатор категории, который сопоставляется с таблицей категорий. Но это приводит к большей взаимосвязи, чем я бы предпочел с точки зрения объектно-ориентированного программирования. Продукты не должны даже знать, что категории существуют, не говоря уже о том, чтобы иметь поле данных, содержащее идентификатор категории! Есть ли способ лучше?