DB / Entity Design: таблица, относящаяся к любой из нескольких таблиц - PullRequest
3 голосов
/ 29 апреля 2009

A Отчет может иметь несколько графиков. Таблица Chart выглядит следующим образом:

  • Chart - Id , ChartId , ReportId , ...

Приведенный выше ChartId может сопоставляться с ChartId с one из следующих типов диаграмм:

  • Линия : ChartId , Толщина , YAxis , XAxis , Цвет, ...
  • Пирог : ChartId , Радиус , Цвет , ...
  • Бар : ChartId , Ширина , Цвет , Граница , ...

Я использую SQL Server, и, к сожалению, альтернативные решения, такие как использование CouchDB и т. Д., Не являются приемлемыми вариантами. Я также намереваюсь отобразить эти таблицы на объекты, используя Entity Framework.

Этот дизайн - мой первый удар, и я вижу несколько проблем с этим дизайном:

  1. Диаграмма . ReportId не может быть внешним ключом для нескольких таблиц, поэтому применение FK является проблемой.
  2. При выполнении запроса SQL (или Linq) мне нужно будет либо выполнить два запроса, чтобы получить тип диаграммы, а затем запросить эту таблицу. Или мне нужно выполнить объединение для всех таблиц, чтобы получить данные диаграммы.
  3. При объединении с типами диаграмм ChartId для этих таблиц должен быть уникальным, поэтому Chart . ChartId отображается только на один из Line . ChartId или Bar . ChartId или Pie . ChartId .
  4. Сопоставить это с EF будет сложно.

Я полагаю, что это достаточно распространенная проблема, что существуют предписанные решения и установленные способы ее решения.

Я на правильном пути с дизайном? И если да, то как преодолеть вышеуказанные проблемы (FK, объединение, уникальный идентификатор для нескольких таблиц и сопоставление).

Решение

Этот ответ является довольно полным о стратегиях. И статья SQL Team о реализации наследования таблиц в SQL Server дала мне то, что я хотел.

Ответы [ 4 ]

2 голосов
/ 29 апреля 2009

Рассматривали ли вы размещение Диаграмм в одной таблице и использование таблицы на наследственное наследование ? Ссылка показывает, как реализовать это в Entity Framework. Является ли он жизнеспособным, зависит от того, насколько разными будут все эти типы диаграмм, и сколько полей потребуется каждому.

Существует также Таблица для каждого типа наследование, которое больше похоже на то, что вы уже описываете.

2 голосов
/ 29 апреля 2009

Я бы решил эту проблему с помощью схемы наследования таблиц:

Chart (ChartId, ChartTypeId)
   PK (ChartId, ChartTypeId)
   CHECK ChartTypeId IN ('Line', 'Bar', 'Pie')

LineChart (ChartId, ChartTypeId)
   PK (ChartId, ChartTypeId)
   FK (ChartId, ChartTypeId) -> Chart
   CHECK ChartTypeId IN ('Line')

Чтобы добавить диаграмму, сначала добавьте ее в «базовую» таблицу диаграмм, а затем в соответствующую таблицу диаграмм «подтип». Проверочные ограничения держат все в порядке.

1 голос
/ 01 мая 2009

Линейные графики. круговые диаграммы и гистограммы являются специализированными формами диаграмм.

Поиск "обобщающей специализации реляционного моделирования" для хороших статей по этому шаблону.

0 голосов
/ 29 апреля 2009

Или мне придется объединиться против все таблицы, чтобы получить данные диаграммы.

Да, и это хорошо.

...