|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Всем привет. Такая задача: есть пользователи, им выдаются некоторые бонусы. Пользователь может активировать бонус, т.е. у бонуса есть статус. И есть нюанс - у каждого пользователя активным может быть только один бонус. Далее активный бонус либо отменяется, либо используется, т.е. в дальнейшем статус его изменяется либо по решению пользователя, либо после срабатываения некоторых условий. Как сделать такое ограничение в базе ? Идеально быть бы сделать partial index , как у конкурентов: Код: sql 1.
Но у нас такого нет, увы. Есть CORE-3384 , но там как-то бесперспективно всё. Просматривается 2 некрасивых решения: 1. Завести отдельную табличку active_bonuses, обеспечивать уникальность с ее помощью. 2. Сделать вычисляемое (в триггере) поле uniq_status, что-то типа case when status = 'active' then status end, и повесить уник на (user_id, uniq_status) Оба решения не нравятся, потому что требуют заводить какие-то дополнительные объекты, являющиеся, по сути, костылями. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 10:19 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Сисдба Мастеркеевич, можно попробовать уникальный индекс по выражению, не знаю будет ли работать Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 10:51 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Сисдба Мастеркеевич, Оно ? Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 10:52 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Симонов Денис, :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 10:52 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Точно, есть же computed by. Забыл. Спасибо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 11:09 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Сисдба Мастеркеевич, А что, история статусов никому не интересна? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 11:31 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Создаешь таблицу с двумя полями - "user_id" и "bonus_id" по полю "user_id" делаешь первичный ключ, оба поля внешним ключом к соответствующим справочникам пользователей и бонусов И ВСЁ! Больше тебе ничего не надо, потому как одному пользователю ты сможешь привязать лишь один бонус. Ну и, как уже упомянул ДикийСерж, хорошо бы добавить историю, то есть в первичный ключ добавить ещё и TIMESTAMP. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 14:12 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
04.06.2019 14:12, rdb_dev пишет: > в первичный ключ добавить ещё и TIMESTAMP. и положение звёзд на небосводе. первичный ключ в который добавлен ещё и TIMESTAMP вырождается в банальный пшшшшшик. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 14:19 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Мимопроходящийпервичный ключ в который добавлен ещё и TIMESTAMP вырождается в банальный пшшшшшик.Похоже, сегодня за обедом ты съел что-то несвежее... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 15:16 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Определись уже, как rdb_devкак одному пользователю ты сможешь привязать лишь один бонус связано с rdb_dev Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 15:33 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
hvlad, последний по времени бонус и есть активный. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 15:36 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
rdb_dev, тему топика читал ? Прочитай. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 15:42 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
hvlad, и чо? Там нагородили огород с полем "status", которое прекрасно и в соответствии с требованиями заменяется таблицей, т.е. последний по времени бонус пользователя имеет статус активный, остальные - неактивный. Если кого-то не устраивает представление данных, можно построить вьюху с вычисляемым значением поля "status". В чём проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 15:51 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
rdb_devВ чём проблема?Всё прекрасно, фантазируй дальше, я - пас ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 16:24 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
hvladrdb_devВ чём проблема?Всё прекрасно, фантазируй дальше, я - пасДа ёлки-палки!... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 16:58 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
04.06.2019 15:16, rdb_dev пишет: > CONSTRAINT "active_bonus__pk" PRIMARY KEY ("user_id", "tmstmp") синтаксический нонсенс. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 17:17 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Мимопроходящий04.06.2019 15:16, rdb_dev пишет: > CONSTRAINT "active_bonus__pk" PRIMARY KEY ("user_id", "tmstmp") синтаксический нонсенс.Неужели? С каких пор у нас запрет на составные первичные ключи? Или для тебя первичный ключ, это исключительно суррогат? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 17:25 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
rdb_dev, запрета нет. Есть вопрос целесообразности и удобства. Составные как и натуральные PK не удобны априори, если уж надо сделать такое ограничение, то обычно ставят UNIQUE в довесок к суррогатному PK ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 17:34 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
rdb_devДа ёлки-палки!...Ты забыл цель - обеспечить уникальность. Ты её не обеспечиваешь. Вместо этого продаёшь историю, о которой никто не просил. Направь свою энергию на что-нить полезное уже PS И - да - таймстамп в PK - это обычно от глупости и не понимания сути задачи. Примерно как и double precision в там же. Не всегда, но чаще всего. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 17:39 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
Симонов Денисrdb_dev, запрета нет. Есть вопрос целесообразности и удобства. Составные как и натуральные PK не удобны априори, если уж надо сделать такое ограничение, то обычно ставят UNIQUE в довесок к суррогатному PKСоставные ПК не удобны, когда таблица не является конечно в иерархии отношений, а если таблица конечна, вполне можно воспользоваться принципом бритвы Оккама и не порождать сущности без надобности. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 17:44 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
hvladПримерно как и double precision в там же. Timestamp хотя бы целый в отличии от. PS: Тупо добавить поле "текущий бонус" в таблицу пользователей не предлагали или я не заметил? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 17:45 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
hvladТы забыл цель - обеспечить уникальность. Ты её не обеспечиваешь.Именно упомянутую уникальность я и обеспечиваю! Условие таково - "у пользователя не может быть более двух активных бонусов одномоментно" и составной ПК по полям "user_id"+"tmstmp" вполне обеспечивает это условие, так как ты не сможешь для одного и того же пользователя добавить в таблицу две записи с разными бонусами, но с одним и тем же штампом времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 18:20 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
rdb_dev, ну да, не сможешь. У тебя мало опыта реальной работы реальных юзеров. В реальных приложениях. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 18:45 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
hvlad, ты хочешь сказать, что для таблицы: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Сервер FirebirdSQL не обеспечить уникальность составного ПК? Тогда тут дело совсем не в пользователях... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 18:51 |
|
Как обеспечить частичную уникальность ?
|
|||
---|---|---|---|
#18+
04.06.2019 18:51, rdb_dev пишет: > Сервер FirebirdSQL не обеспечить уникальность составного ПК? > Тогда тут дело совсем не в пользователях... угу. тут дело в "дизайнере". ибо уникальность именно ЭТОГО ключа не несёт никакой смысловой нагрузки. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2019, 18:53 |
|
|
start [/forum/topic.php?fid=40&fpage=23&tid=1560689]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 155ms |
0 / 0 |