Использование пути к файлу в качестве первичного ключа в MySQL - PullRequest
2 голосов
/ 27 марта 2009

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

Хотя у меня есть несколько проблем, таких как необходимость указать длину ключа (ошибка 1170). Что я должен делать? Используйте целое число в качестве первичного ключа, и каждый раз, когда мне нужно получить доступ к информации о файле 'x', делайте "где FilePath = x"?

Спасибо за потраченное время на чтение моего вопроса.

Ответы [ 4 ]

4 голосов
/ 27 марта 2009

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

Другим вариантом будет вычисление хеша фиксированной длины из пути к файлу с использованием недорогой хеш-функции, такой как MD5() (хотя MD5 недостаточно силен, чтобы использовать его для паролей, он достаточно силен для обеспечения уникальности, учитывая входные данные в данном случае).

3 голосов
/ 27 марта 2009

Используйте int в качестве первичного ключа и укажите Unique в поле для пути к файлу.

CREATE TABLE `cms`.`test` (
    `id` INT( 32 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `filepath` VARCHAR( 255 ) NOT NULL ,
UNIQUE (
    `filepath`
)
) ENGINE = MYISAM 
1 голос
/ 27 марта 2009

Не используйте естественный ключ (путь / имя файла), используйте суррогатный ключ (int)

Я бы сделал первичный ключ INT и поместил любой путь и файл в другой столбец. Было бы медленно иметь длинную строку в качестве ключа и / или в качестве внешнего ключа в других таблицах.

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

Когда мы храним информацию о файле, мы просто сохраняем имя, путь строится на основе других данных: связанных элементов (порядок, инцидент, задание и т. Д.), А затем идентификатора этих других данных и т. Д ...

1 голос
/ 27 марта 2009

Можете ли вы указать максимальную длину для пути к файлу и изменить столбец на varchar?

Эта статья объясняет ошибку . По сути, вы не можете поместить ключ в столбец текста или большого двоичного объекта, потому что ключ должен иметь длину, с которой можно проверить уникальность. Но столбцы text и blob не поддерживают длины. Таким образом, вы не можете использовать их в ключе.

В более поздних версиях MySQL столбцы Varchar могут содержать до 65 тыс. Символов

Значения в столбцах VARCHAR являются строками переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в 5.0.3 и более поздних версиях. Максимальная эффективная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который является общим для всех столбцов) и используемого набора символов.

...