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