Модель гетерогенного типа в базе данных - PullRequest
2 голосов
/ 03 февраля 2009

Я пытаюсь найти лучший способ моделировать набор "классов" в моей системе. Обратите внимание, что я говорю не о ОО-классах, а о классах ответов (в опросе). Итак, модель выглядит так:

Класс можно определить с тремя различными типами данных:

  • Класс кодированных ответов (где кодированные ответы состоят из строковой метки и целочисленного значения)

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

  • Класс строковых ответов (определяется как набор шаблонов регулярных выражений)

Прямо сейчас у нас есть: таблица классов (для определения уникальных классов) и таблица ClassCoded, ClassNumeric и ClassString (все с ClassID в качестве внешнего ключа для таблицы классов).

Моя проблема в том, что сейчас класс может технически быть и кодированным, и числовым с помощью этой системы. Есть ли способ определить набор таблиц, чтобы справиться с этой ситуацией ??

Ответы [ 3 ]

0 голосов
/ 03 февраля 2009

Существует два основных способа обработки подтипов: либо с разреженными столбцами, добавляя столбцы для каждого возможного свойства (предпочтительно с проверочными ограничениями, чтобы значения имели только один тип), либо для создания таблицы для супертипа и затем трех таблиц подтипы, каждый с внешними ключами обратно в таблицу супертипов. Затем добавьте проверочное ограничение, чтобы гарантировать, что только один из трех возможных столбцов типа не равен нулю.

Лично я решаю, какую из двух реализаций использовать, основываясь на том, насколько похожи подтипы. Если 90% столбцов являются общими, я использую метод разреженных столбцов, если очень мало информации используется, я использую метод нескольких таблиц.

0 голосов
/ 03 февраля 2009

Я не понимаю, в чем проблема. Это просто миксин наследование. Почему класс не может просто иметь записи, каждая из которых ClassCoded и ClassNumeric?

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

0 голосов
/ 03 февраля 2009

Реляционные базы данных не справляются с этим элегантно. Самый простой способ - определить столбцы для всех типов данных и заполнить только соответствующие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...