У меня есть таблица, которая представляет лог 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
Это облегчает задачу. чтобы получить целое выражение, и быстро, как простая строка, но трудно обновить правило, так как оно должно быть декодировано и затем изменено.
Любые другие способы достижения этого действительно приветствуются, они не ограничены к реляционным базам данных, но у меня больше опыта работы с реляционными базами данных.