LINUX.ORG.RU

История изменений

Исправление 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 оптимален когда есть граничение на количество строк, как в твоем случае.

Запросы не проверял, но иидея должна быть понятна