моделировать абстрактный базовый класс и подклассы в базе данных - PullRequest
5 голосов
/ 19 сентября 2009

У меня есть 4 подкласса: Video, Image, Note и Form. Каждый из них содержит разные типы данных. Например, класс Image содержит путь к файлу образа в свойствах диска и изображения, а класс Form содержит значения поля формы. Однако общим элементом между каждым элементом являются GPS-координаты и заголовок, поэтому у меня есть следующий абстрактный базовый класс:

public abstract class Content
{
    public float? Latitude { get; set; }
    public float? Longitude { get; set; }
    public float? Heading { get; set; }
}

Однако я не могу понять, как это смоделировать в базе данных. В настоящее время у меня есть таблица с именем Events (для примера, скажем, событие является днем ​​рождения) и 4 таблицы (Videos, Images, Notes и Forms). У каждой таблицы есть внешний ключ, ссылающийся на первичный ключ Events.

Используя LINQ-to-SQL, я получаю 5 классов для каждой таблицы. Это хорошо, если мне нужен только один тип данных, например Event.Images, но я хочу подсчитать общее количество «содержимого», которое есть у Event, и получить координаты GPS. Я могу достаточно легко подсчитать счет, используя Event.Images.Count() + Event.Videos.Count() + ..., но я не могу сделать то же самое для координат GPS. Есть ли способ, которым я могу смоделировать базу данных так, чтобы я мог использовать базовый класс для каждого элемента и при этом иметь возможность получать отдельный строго типизированный элемент, когда мне нужно увидеть его данные?

Ответы [ 4 ]

8 голосов
/ 19 сентября 2009

Для этого задокументированы три модели паттернов корпоративной архитектуры приложений Мартина Фаулера, каждый из которых имеет свои компромиссы:

1 голос
/ 19 сентября 2009

Это один из способов сделать это.

Вообще говоря, есть два других способа:

  • таблица для подкласса: вместо того, чтобы пытаться разделить базовый класс в базе данных, просто создайте отдельные таблицы для каждой.

  • таблица на иерархию: поместите в таблицу как расширенный набор всех полей, так и столбец «дискриминатор» и храните их в одном месте.

Чтобы выяснить, что правильно, подумайте о шаблонах использования:

  • если вы обычно относитесь к ним независимо и выполняете запросы независимо, то лучше всего использовать отдельные таблицы - то, что у вас есть, или таблицу для каждого подкласса.
  • если они рассматриваются как разнородные коллекции, поэтому вы хотите рассматривать их как таковые, проще будет использовать одну таблицу

Также посмотрите, что ваш инструмент поддерживает наиболее естественно. Они все работают.

0 голосов
/ 14 января 2011

Посмотрите на эти ТАК примеры, это может быть полезно.

0 голосов
/ 08 января 2011

На самом деле, этот точный вопрос задают очень много, и на него много раз отвечают . Вы, вероятно, не искали, используя терминологию базы данных.

Проблема заключается в применении ОО терминологии и мышления в необъектной предметной области; делая обычное простое задание очень сложным и ограниченным.

Книги Мартина Фаулера и Скотта Амблера не стоят доллара за многие из них, подробности в этот ответ , начиная с записи 11 декабря 10 .

...