В качестве альтернативы эта функция может просто сделать SELECT FOR UPDATE и обновить значения вашей таблицы. Я думаю, что должен быть довольно быстрым.
я есть база данных с компаниями и их продуктами, я хочу, чтобы каждая компания имела отдельную последовательность идентификаторов продуктов.
Я знаю, что postgresql не может этого сделать, единственный способ - создать отдельную последовательность для каждой компании, но это громоздко.
Я думал о решении иметь отдельную таблицу для хранения последовательностей
CREATE TABLE "sequence"
(
"table" character varying(25),
company_id integer DEFAULT 0,
"value" integer
)
«таблица» будет содержать имя таблицы для последовательности, такой как продукты, категории и т. д.
и значение будет содержать фактические данные последовательности, которые будут использоваться для product_id на вставках
Я буду использовать значение UPDATE ... RETURNING; чтобы получить идентификатор продукта
Мне было интересно, насколько эффективно это решение?
С блокировкой на уровне строк, только пользователям одной компании, добавляющим строки в одну и ту же таблицу, придется ждать, чтобы получить блокировку, и я думаю, что это уменьшает проблемы состояния гонки.
Есть ли лучший способ решить эту проблему?
Я не хочу использовать последовательность для таблицы продуктов для всех компаний, потому что разница между идентификаторами продуктов будет большой, я хочу, чтобы она была простой для пользователей.