Guid в качестве первичного ключа? - PullRequest
6 голосов
/ 29 октября 2010

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

Я думал о том, чтобы вставить guid в качестве первичного ключа, который я могу добавить в таблицы и вставить при вставке всех новых данных.
Тем не менее, я опасаюсь использовать поле char (используется для хранения guid) в качестве ключа. Это действительная проблема, или использование поля char, зная, что оно всегда будет достаточным решением? Кто-то может порекомендовать лучший подход?

Спасибо

Ответы [ 3 ]

6 голосов
/ 29 октября 2010

MySQL не предоставляет тип GUID / UUID, поэтому вам нужно будет сгенерировать ключ в коде, который вы используете для вставки строк в БД. char(32) или char(36) (если включает дефисы) - лучший тип данных для хранения GUID вместо фактического типа данных GUID.

1 голос
/ 29 октября 2010

Извините, я не на 100% знаком с MYSQL, в SQL Express есть тип уникального идентификатора, для которого можно задать столбец, который действительно является GUID. Вы даже можете настроить его на автоматическую нумерацию, чтобы он выбирал случайные.

Мой начальник на работе ненавидит GUIDS, и мы много работаем с автономными / онлайн-системами, поэтому он придумал другую систему, в которой каждой базе данных кормления назначается идентификатор (называемый DEPT), и всякий раз, когда он вставляет в мастер Стол из одного из меньших, он записывает свой DEPT в отдельный столбец Integer, чтобы его можно было легко сортировать.


Чтобы реализовать это, вы должны сделать второй ключ (чтобы каждая таблица импортировалась для таблицы с двумя ключами).

Пример:

PrimaryKey1    DEPT    Name
1              0       Slink
2              0       Fink
3              0       Werd
1              1       Slammer
2              1       Blam
1              2       Werrr
2              2       Soda
0 голосов
/ 29 октября 2010

Некоторые БД, такие как ms sql server, предоставляют тип данных guid, я не уверен насчет mysql.

В общем случае нет проблем с char или varchar в качестве первичного ключа, если они не слишком длинные. Обычно целые числа предпочтительнее, потому что они немного быстрее, но это зависит от того, насколько это важно для вас.

Эффективно, вы также можете использовать составной первичный ключ. Один компонент может быть вашим исходным первичным ключом, который уникален только в одном БД. Вторым компонентом может быть номер базы данных, если вы можете назначить уникальный номер каждой базе данных.

Вы также можете использовать следующую схему:

int newId = dbNumber * 10000 + iDInSmallDb;

Таким образом, последние 4 цифры - это исходный дБ, остальные цифры - номер дБ.

...