Как установить разные идентификаторы автоинкремента для двух таблиц - PullRequest
3 голосов
/ 28 ноября 2011

У меня есть 2 таблицы, обе с автоматически увеличиваемыми первичными ключами, и я хочу, чтобы идентификаторы были уникальными для двух таблиц - т.е. никакие два равных значения не будут использоваться в качестве первичных ключей для этих таблиц.

Комув контексте, я хочу сделать что-то похожее на то, что делает Facebook с их идентификаторами - делиться ими с пользователями, страницами, событиями и т. д. Кроме того, я хочу убедиться, что смогу масштабировать систему в будущем.

Я имею в виду три идеи прямо сейчас, и не могу решить пойти с одной из них.

  1. Увеличение идентификаторов на 10 и начиная с разных значений - т.е. Таблица A: 1, 11, 21 .... & Таблица B: 2, 12, 22 - Это немного глупо, так как вы теряете много идентификаторов

  2. Использование GUID - я думаю, я могу сделать лучше

  3. Использование беззнакового бигинта для столбца id, начиная с 1 с одной таблицей и с достаточно большого числа для другой

Что лучшеспособ сделать это?Или есть другой способ?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Создайте третью таблицу с именем ID или что-то подобноеЭто будет единственная таблица с auto_increment.Он будет использоваться только для генерации идентификаторов, поэтому вы идете примерно так:

insert into ids (id) values (null);
@id = select LAST_INSERT_ID();
insert into users (id, name) values (@id, "Andreas ");

То же самое относится ко всем остальным таблицам, для которых требуется идентификатор.Вы можете добавить третью таблицу в любое время.

Если хотите, вы можете даже сохранить в таблице идентификаторов информацию о том, какая таблица содержит эту строку.

insert into ids (id, table) values (null, "users");
@id = select LAST_INSERT_ID();
insert into users (id, name) values (@id, "Andreas ");
0 голосов
/ 28 ноября 2011

Все это в порядке.

Вы можете использовать вариант 1, не теряя клавиш, установив инкремент 2 и начальное смещение 1 для первой таблицы и 2 для второй таблицы.Тогда идентификаторы таблицы 1 пойдут в 1,3,5 ... а таблицы 2 пойдут в 2,4,6 ...

3, в основном идентично варианту 1. Хотя мне не нравится идеянеобходимость отслеживать какое-то магическое число в моем коде, если мне когда-либо понадобилось различать идентификаторы для каждой таблицы в моем коде.

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

0 голосов
/ 28 ноября 2011

Использовать GUID / UUID с или какой-либо вид хранимых процедур requestUniqueKey, который поддерживает свою собственную таблицу ключей.К сожалению, не существует рекомендуемого способа хранения UUID в MySQL, насколько мне известно (например, UNIQUEIDENTIFIER в MS SQL Server).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...