SQL Представление иерархии и композиции - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть таблица, которая представляет лог c правил. Правило имеет один левый компонент, логический оператор и правый компонент. Например: (Comp1 и Comp2)

Этот компонент может быть двух типов: «расчет» (другая таблица) или другое правило.

CREATE TABLE calculation
(
    id_calculation uuid PRIMARY KEY,
    id_ record UUID, --- FK to another table, record
    operator text, -- Can be GT/GTE/...  will be in a lookup table
    value double precision
)

По сути, я пытаюсь представляют случаи, подобные следующему:

(Calc1 AND Calc2) OR (Calc3)

Это будет переводиться как:

1) Rule1 R1:  Calc1 AND Calc2    -- This is a base rule R1 composed of two calculations
2) Rule2 R2:  R1 OR Calc3        -- This is a rule composed of another rule and a calculation

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

Моя проблема в том, как я могу представить такой тип отношений с помощью реляционного дизайна. Моя первая мысль была:

Первый подход

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

Затем я подумал о переносе этого отношения во вспомогательную таблицу, например:

Второй подход

Здесь я могу внести внешние ключи в соответствующую таблицу, и с контрольным ограничением убедиться, что используется только один из этих идентификаторов, а другой равен NULL. Проблема заключается в том, что этот подход создает циклическое отношение внешнего ключа между таблицами RuleComponent и RuleComponent ... Даже если это действительно, поскольку id_related_rule в таблице RuleComponent не может иметь значение null, теперь неудобно вставлять данные и поддерживать эти ограничения.

Другой вариант - сохранить это отношение в виде строки, используя Обратный полис sh Обозначение , которое оставит выражение в виде: Calc1 Calc2 AND Calc3 OR

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

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

...