MySQL AUTO_INCREMENT по группам с использованием InnoDB или альтернатив - PullRequest
1 голос
/ 21 февраля 2012

Я проектирую веб-приложение с использованием базы данных MySQL, и я застрял в одном из тонкостей моей базы данных.

Вот пример типа данных, которые я хотел бы хранить с использованием механизма InnoDB:

user_id   account_id
1         1
1         2
1         3
2         1
2         2
3         1

Как видно из вышесказанного, я бы хотел, чтобы account_id автоматически увеличивался для каждого отдельного пользователя. Вот некоторые проблемы, с которыми я столкнулся:

  1. Я знаю, что для того, чтобы сделать это автоматически, я мог бы использовать движок MyISAM, но после некоторого чтения я понял, что, когда обновления происходят, этот движок блокирует всю таблицу, а не просто один ряд Это не хорошо для меня. Кроме того, MyISAM не обеспечивает ссылочную целостность, которую я очень хотел бы сохранить.

  2. Я прочитал другие решения этой проблемы, и они использовали триггер. Конечно, я мог бы использовать триггер, но я не очень люблю триггеры, так как их сложнее поддерживать, чем одну таблицу.

  3. Возможно, я мог бы использовать последовательность, но я думаю, что было бы некрасиво поддерживать отдельную последовательность для каждого пользователя.

  4. Я мог бы просто использовать уникальный AUTO_INCREMENT, не обращая внимания на user_id, который работал бы очень хорошо. Есть две вещи, которые мне не нравятся: 1. Таким образом, мой smallint потенциально может вырасти до int или bigint, что потребует намного БОЛЬШЕ места для хранения. Я знаю, что место для хранения дешево, но я все же хотел бы минимизировать его. 2. Было бы намного чище автоматическое увеличение по группам.

Я хотел бы получить отзывы / мнения тех пользователей, которые столкнулись и успешно решили эту проблему. Возможно, есть другое решение, о котором я не думал. Возможно, есть другой способ организовать мой стол, о котором я даже не думал.

1 Ответ

1 голос
/ 21 февраля 2012

Используйте простое AUTO_INCREMENT и игнорируйте хранилище:

  • Если вы масштабируете до миллиона пользователей, каждый из которых имеет 1000 аккаунтов, вы будете нужно ок. 3 МБ дополнительного хранилища.
  • Выигрыш в производительности первичного индекса с одним полем (в основном отсортированного в реальном хранилище!) Будет стоить намного больше, чем этот бит памяти
...