Поскольку у сущностей столько общих атрибутов, вы можете думать о них как о подтипах.
Логически у вас будет супертип PriceEntry и подтипы ForwardPriceEntry и PoolPriceForecastEntry. Один вопрос, на который нужно ответить, будет ли цена общей для супертипа. Я предполагаю, что это так.
Теперь вопрос в том, как физически реализовать подтип. Есть 3 подхода, которые вы можете использовать:
- Создать таблицу для каждого подтипа (свертывание)
- Создание единой таблицы со всеми атрибутами (сведение)
- Создать одну таблицу супертипа и таблицу подтипов для каждого подтипа (Identity)
У каждого из этих подходов есть свои плюсы и минусы. Для обсуждения плюсов и минусов каждого подхода см. Получение физического с подтипами .
В этом случае, поскольку подтипы совместно используют так много атрибутов, вы можете воспользоваться сводным подходом и создать одну таблицу.
Таблица PriceEntry может выглядеть следующим образом:
PriceEntryId (PK)
PriceEntryTypeCode (NN)
StartDate (NN)
EndDate
SimulationItemId (NN)
Price (NN)
MarketPriceDataSetId (FK)
PoolPriceForecastDataSetId (FK)
Вы по-прежнему можете применять FK в столбцах MarketPrice и PoolForecast. Вы также можете добавить ограничение проверки уровня таблицы, чтобы гарантировать заполнение хотя бы одного из FK.
Однако, поскольку существует только один атрибут, который отличается между двумя подтипами, многие плюсы и минусы не сильно указывают в одном направлении. Поэтому, в конце концов, я бы предпочел сделать модель данных легкой для понимания и использования. Для меня подход с двумя столами (откат) дает хороший баланс; концептуально это легче понять, чем накопительный пакет, а при разработке его проще использовать, чем идентификацию (без объединений или множественных вставок / обновлений).