История изменений
Исправление shimshimshim, (текущая версия) :
При создании емейл создавай сразу максимальное количество строк алиасов для каждого емейл, и вместо добавления делай
update aliases set alias_email='ivanovalias@fake.email' where id in (select id FROM alias_email WHERE alias_email is null and email='ivanov@real.email' LIMIT 1)
returning id
И наоборот set alias_email=null когда удаляешь алиас
и все это в serializable транзакции. Конфликты от оптимистичной блокировки разрулишь на клиенте, они в твоем случае будут очень-очень редки.
Вариант с update оптимален когда есть граничение на количество строк, как в твоем случае.
Запросы не проверял, но идея должна быть понятна.
Проблема будет только с уникальным индексом чтобы алиасы + основные емейлы были уникальынми. Можно для алиасов завести отдельный домен, можно оба емейла хранить в одной колонке.
Исправление shimshimshim, :
При создании емейл создавай сразу максимальное количество строк алиасов для каждого емейл, и вместо добавления делай
update aliases set alias_email='ivanovalias@fake.email' where id in (select id FROM alias_email WHERE alias_email is null and email='ivanov@real.email' LIMIT 1)
returning id
И наоборот set alias_email=null когда удаляешь алиас
и все это в serializable транзакции. Конфликты от оптимистичной блокировки разрулишь на клиенте, они в твоем случае будут очень-очень редки.
Вариант с update оптимален когда есть граничение на количество строк, как в твоем случае.
Запросы не проверял, но идея должна быть понятна
Исправление shimshimshim, :
При создании емейл создавай сразу максимальное количество строк алиасов для каждого емейл, и вместо добавления делай
update aliases set alias_email='ivanovalias@fake.email' where id in (select id FROM alias_email WHERE alias_email is null and email='ivanov@real.email' LIMIT 1)
returning id
И наоборот set alias_email=null когда удаляешь алиас
и все это в serializable транзакции. Конфликты от оптимистичной блокировки разрулишь на клиенте, они в твоем случае будут очень-очень редки.
Уникальный индекс (email, alias_email) будет нормально работать т.к. все нуллы считаются уникальными. И просто (alias_email) аналогично.
Вариант с update оптимален когда есть граничение на количество строк, как в твоем случае.
Запросы не проверял, но идея должна быть понятна
Исправление shimshimshim, :
При создании емейл создавай сразу максимальное количество строк алиасов для каждого емейл, и вместо добавления делай
update aliases set alias_email='ivanovalias@fake.email' where id in (select id FROM alias_email WHERE alias_email is null and email='ivanov@real.email' LIMIT 1)
returning id
И наоборот set alias_email=null когда удаляешь алиас
и все это в serializable транзакции. Конфликты от оптимистичной блокировки разрулишь на клиенте, они в твоем случае будут очень-очень редки.
Уникальный индекс (email, alias_email) будет нормально работать т.к. все нуллы считаются уникальными.
Вариант с update оптимален когда есть граничение на количество строк, как в твоем случае.
Запросы не проверял, но идея должна быть понятна
Исправление shimshimshim, :
При создании емейл создавай сразу максимальное количество строк алиасов для каждого емейл, и вместо добавления делай
update aliases set alias_email='ivanovalias@fake.email' where id in (select id FROM alias_email WHERE alias_email is null and email='ivanov@real.email' LIMIT 1)
returning id
И наоборот set alias_email=null когда удаляешь алиас
и все это в serializable транзакции. Конфликты от оптимистичной блокировки разрулишь на клиенте, они в твоем случае будут очень-очень редки.
Уникальный индекс (email, alias_email) будет нормально работать т.к. все нуллы считаются уникальными.
Вариант с update оптимален когда есть граничение на количество строк, как в твоем случае.
Запросы не проверял, но иидея должна быть понятна
Исходная версия shimshimshim, :
При создании емейл создавай сразу максимальное количество строк алиасов для каждого емейл, и вместо удобавления делай
update aliases set alias_email='ivanovalias@fake.email' where id in (select id FROM alias_email WHERE alias_email is null and email='ivanov@real.email' LIMIT 1)
returning id
И наоборот set alias_email=null когда удаляешь алиас
и все это в serializable транзакции. Конфликты от оптимистичной блокировки разрулишь на клиенте, они в твоем случае будут очень-очень редки.
Уникальный индекс (email, alias_email) будет нормально работать т.к. все нуллы считаются уникальными.
Вариант с update оптимален когда есть граничение на количество строк, как в твоем случае.
Запросы не проверял, но иидея должна быть понятна