Oracle Lab DB Design (конвейерные функции?) - PullRequest
0 голосов
/ 18 ноября 2009

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

Чего я пытаюсь достичь
Я разрабатываю лабораторную базу данных, в которой для каждого из следующих объектов требуется ровно один родитель (слева) и хотя бы один ребенок (справа): request (REQ) -> sample (SAM) -> test (TST) -> measurement (MEA).

Каждая сущность имеет следующее:

  • Шаблон - (или тип) этого объекта (шаблоны испытаний могут включать: тест pH, титрование и т. Д.)
  • Пользовательские таблицы - поля таблицы, которые применяются только к этому шаблону
  • Расчеты - результаты соответствующих формул из данных для этой сущности (и дочерних элементов)

Наши спецификации часто очень сложны. Например, в спецификации может быть указано «Третье измерение может быть выполнено, если первые два не соответствуют спецификации», или «Выполнить метод длинных испытаний, если метод быстрых испытаний завершился неудачей».

Мне нужна функция, которая принимает ENTITY_id и (на основе уже введенных данных и правил спецификации) возвращает список доступных дочерних шаблонов.

Вопрос
Являются ли конвейерные функции (как описано ниже в tuinstoel) лучшим способом реализации функции required_children (), которую я пытаюсь достичь?

Если нет, что вы предлагаете?

Ответы [ 4 ]

2 голосов
/ 18 ноября 2009

Вы хотите выбрать основные данные и подробные данные одним оператором выбора? Попробуйте выбрать ..cast..Mulitiset. Смотрите здесь: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/operators006.htm

EDIT1

Кажется, OP требует конвейерную функцию. Вы можете использовать курсор как параметр конвейерной функции. Конвейерные функции очень гибкие. Смотрите здесь: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2345

1 голос
/ 20 ноября 2009

Не думаю, что вам действительно нужна конвейерная функция. Конвейерные функции хороши для генераторов, которые могут создавать данные вечно. Например, вы можете использовать конвейерную функцию, которая возвращает числа Фибоначчи. Концептуально конвейерные функции такие же, как итераторы в .net.

Для ваших целей вы также можете использовать нетранслируемую табличную функцию. Это функция, которая собирает (генерирует, вычисляет и т. Д.) Данные в «массив записей» и в конечном итоге возвращает этот массив. В зависимости от того, что вам нужно сделать, это может быть проще в использовании, чем конвейерные функции или нет. Если «массив записей» является чем-то естественным при обработке данных, то это может быть лучшим выбором. В противном случае конвейерные функции могут быть лучше.

0 голосов
/ 27 ноября 2009

При таких сложных спецификациях я бы использовал либо объектно-ориентированный язык, который поддерживает полиморфизм, либо механизм правил, такой как Drools (http://www.jboss.org/drools/).). Вы по-прежнему можете хранить данные в базе данных и использовать запросы для ограничения количества максимально возможная обработка в памяти.

Используя объектно-ориентированный язык (например, Java или, возможно, процедурный язык вашей базы данных), вы можете иметь базовый класс (или интерфейс) спецификации, а затем реализовать определенное поведение в подклассах. В базе данных вы должны указать, где применяется Спецификация.

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

0 голосов
/ 20 ноября 2009

Являются ли конвейерные функции лучшим способом реализации функции required_children (), которую я пытаюсь достичь?

Я не согласен - функционально это то же самое, что использовать временную таблицу, но вы можете сделать то же самое, используя операторы INSERT / UPDATE в родительской функции.

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