2010-01-27 4 views
2

Я хочу создать уникальный идентификатор базы данных. Этот уникальный идентификатор должен быть одним полем каждой строки в каждой таблице этой базы данных.Поддерживать уникальный идентификатор для нескольких таблиц

Есть несколько подходов я рассмотрел:

  • Создать один мастер-таблицу с автоматическим приращением поля и триггером в любой другой таблице, например:

    «перед вставкой здесь , вставить в мастер-таблицу -> получить значение автоматического увеличения -> и использовать это значение в качестве первичного ключа здесь »

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

  • Добавить поле uniqueId к каждой таблице и заполнить это поле с помощью генерируемого PHP целого числа ... что-то вроде unix-timestamp плюс случайное число.

    Но я должен был использовать BIGINT как тип данных, что означает большой index_length и большой data_length.

  • Подобно идее «UniqueID», но вместо внесения BIGINT я использую VARCHAR и использовать uniqid() для заполнения этого значения.

+3

Какова цель уникального идентификатора базы данных? Если каждая таблица имеет первичный ключ, то каждая строка уже имеет уникальный идентификатор, состоящий из tablename.pkey. – dnagirl

+0

Это ужасная, ужасная идея и может привести только к боли и страданиям. –

+0

Я думал об этом несколько раз, для таких вещей, как создание (почти) каждого элемента на странице, комментируемое или даже для оценок по каждому элементу. Я всегда думал, что это упростит ситуацию. @Ignacio: им не говорится об использовании этого в качестве первичного ключа, если вы так считаете. Почему вы думаете, что уникальный идентификатор через несколько таблиц - это плохо? –

ответ

2

Поскольку вы ищете мнение ... Из трех идей, которые вы даете, я бы «голосовать» за uniqid() решения. Это выглядит довольно дешево с точки зрения исполнения (но, возможно, не для реализации).

Проще простого решения (я думаю) было бы просто добавить поле в каждую таблицу для хранения указателя и установить значение по умолчанию для поля как функцию MySQL, которая генерирует guid (я думаю, что это UUID). Это позволяет базе данных выполнять работу за вас.

И в духе придумывания случайных идей ... Было бы возможно, чтобы какой-то автономный процесс заполнил идентификаторы асинхронно. Убедитесь, что каждая таблица имеет соответствующее поле и значение по умолчанию равно 0/пусто. Тогда автономный процесс может просто запустить запрос в каждой таблице, чтобы найти строки, у которых еще нет уникального идентификатора, и он может их заполнить. Это позволит вам управлять идентификатором и даже использовать какое-то инкрементное целое число. Это, конечно же, требует, чтобы вам не понадобился уникальный идентификатор сразу каждый раз, когда была вставлена ​​запись.

+0

Спасибо за ваши мысли, отметьте. моим личным любимым решением, до сих пор, является решение BIGINT, потому что я немного боюсь uniqid(), создавая в любое время id, который просто не уникален. Мне также нравится ваша идея UUID() ... mysql, но это будет очень длинная строка. unix_timestamp + случайное число с максимум 9 номерами будет почти на 50% меньше, и практически невозможно создать идентификатор, который не является уникальным ... –

Смежные вопросы