Ваш коллега прав.Я дам вам краткий обзор теории и пример того, почему, но вам будет лучше, если вы прочитаете учебник CJ Date.
Основная проблема с таблицей UserCard состоит в том, что у нее нет естественного ключа .Вы добавили бессмысленное значение id
, чтобы сделать его «уникальным», но нет никакого существенного различия между идентификаторами 1 и 2: нет 1006 * различий: в их значениях нет различий, поэтому то, что они представляют, неразличимо.Когда вы обнаруживаете, что отслеживаете вещи, которые не можете отличить друг от друга, обычным решением является их подсчет.Это то, что ваш банк делает с долларами.
Реляционная теория основана на наборах различных (неповторяющихся) элементов.Вы игнорируете это основание на свой страх и риск.
На практике - и только один пример - что происходит, когда пользователь сбрасывает одну карту?Как вы удалите неразличимую строку?Ваш коллега может сказать:
update UserCard set quantity = quantity - 1 where user = 1 and card = 1
delete UserCard where quantity = 0
Что вы будете делать?Обойти проблему с другим не теоретическим клуджем, таким как limit 1
?Что если ограничение не равно 1, потому что произвольная группа пользователей сбросила свои карты?
Вы частично помогли себе с помощью своей искусственной уникальности:
delete UserCard where id =
(select min(id) from UserCard where user = 1 and card = 1)
, которая показывает, насколько уникальна полезна.Но quantity
твой друг.Следовательно, ваш дизайн и запрос будут проще, если вы будете использовать теорию вместо борьбы с ней.