У меня есть 2 таблицы, назовем их T_FATHER
и T_CHILD
, где у каждого отца может быть несколько дочерних элементов, например:
T_FATHER
--------------------------
ID - BIGINT, from Generator
T_CHILD
-------------------------------
ID - BIGINT, from Generator
FATHER_ID - BIGINT, Foreign Key
Теперь я хочу добавить счетчик в таблицу T_CHILD
, который начинается с 1 и добавляет 1 для каждого нового ребенка, но не глобально, а для каждого отца, например:
ID | FATHER_ID | COUNTER |
--------------------------
1 | 1 | 1 |
--------------------------
2 | 1 | 2 |
--------------------------
3 | 2 | 1 |
--------------------------
Моя первоначальная мысль заключалась в создании триггера перед вставкой, который подсчитывает, сколько дочерних элементов присутствует для данного отца, и добавляет 1 для счетчика. Это должно работать нормально, если только нет двух вставок одновременно, которые заканчиваются одним и тем же счетчиком. Высоки шансы, что на самом деле этого никогда не произойдет, но лучше сэкономить, чем потом сожалеть.
Я не знаю, можно ли использовать генератор, но не думаю, что на каждого отца должен быть генератор.
Мой текущий подход заключается в использовании вышеупомянутого триггера и добавлении уникального индекса к FATHER_ID
+ COUNTER
, чтобы выполнялась только одна из одновременных вставок. Мне придется обработать исключение на стороне клиента (и повторить попытку неудачной вставки).
Есть ли лучший способ справиться с этим непосредственно в Firebird?
PS: ни в одной из двух таблиц не будет никаких удалений, так что это не проблема.