Задать вопрос
@rooooraaaaa

Как правильно обеспечить уникальность записей в тиблице?

Есть таблица вида:

id int auto increment
tuple_first char(32)
tuple_second char(32)
other_field text
...


В которой соответственно id - это суррогатный ключ, а пара ( tuple_first, tuple_second ) - должна быть уникальной в пределах таблицы (на ней стоит уникальный ключ).

Данные в таблицу вставляются (и иногда обновляются) как insert ... on duplicate key update

Проблема в следующем:
- если оставить всё, как есть, то primary key будет обновляться при каждой вставке, из-за чего он когда-то закончится.
- убрать суррогатный ключ, и использовать как первичный кортеж нельзя - во-первых, длинный первичный ключ это плохо, во-вторых, ряд ОРМ (например, Eloquent) не умеет работать с первичными ключами на несколько колонок.
- убрать insert ... on duplicate key update и при вставке вручную проверять и делать insert/update в зависимости от наличия строки в таблице - это кажется тупостью.

Собственно, вопрос: как умные люди решают вопрос уникального кортежа в такой таблице?

У меня пока есть только одно компромиссное решение: использовать как primary key ещё одну колонку, в которой будет md5( tuple_first, tuple_second ). Но очевидно, что это решение содержит в себе все минусы от всех предыдущих, пускай и в меньшей мере.
  • Вопрос задан
  • 152 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@galaxy
если оставить всё, как есть, то primary key будет обновляться при каждой вставке
не ключ, а внутренний объект (аналог sequence в других СУБД)
из-за чего, во-первых, он когда-то закончится
что, прям так много вставок? сделайте поле BIGINT
таблица постоянно будет переиндексироваться (старая с маленьким ключом запись при обновлении будет "подниматься" наверх)
вообще не понял, что это значит

как умные люди решают вопрос уникального кортежа в такой таблице?
в описанном случае не вижу никаких проблем использовать insert ... on duplicate key update
Ответ написан
Fadmin
@Fadmin
"Умные люди" не делают автоинкремент интов суррогатным ключом а делают primary key uuid, и по возможности генерят его в приложении. И забыл сказать, не используют mysql "умные люди".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы