2016-04-05 2 views
0

Мне нужно заполнить базу данных набором $ CSV-файлов, строкой хеш-таблицы $ string, md5 ($ string).Первичный ключ таблицы поиска хэша

Мой вопрос: Следует ли использовать строку в качестве Первичного ключа? Хеш? Добавить дополнительный столбец идентификатора?

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

Я спрашиваю с представлением о производительности, учитывая, что он будет заполнен как минимум 35 ГБ данных. Так что действительно любые предложения оценили

ответ

0

В итоге я использовал поле SERIAL id, поэтому я мог подсчитать, сколько записей у меня было.

Начальная проблема началась, так как я думал, что вы можете только индексировать столбцы с помощью PRIMARY KEY.

Так что проблема решена сейчас, я просто проиндексирован правильно, и производительность великолепна!

+0

Вы можете ** не ** использовать столбец 'serial' для подсчета количества строк. Цифры ** не ** гарантированы без пробелов, и если вы удалите строки, эти идентификаторы будут ** не ** использоваться повторно. –

+0

Ничего себе! Спасибо за головы, не понял этого. Однако в этом конкретном случае я не буду удалять записи. – John

0

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

  • Создайте серийный (автоинкрементный) столбец id в качестве первичного ключа.
  • Создайте уникальный индекс на name.

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

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

+0

Я занимаюсь проверкой паролей и статистикой, и я нахожу, что я взламываю хэши, чтобы обнаружить, что они были слабыми паролями. Я полагал, что буду просто прекомпостировать все возможные комбинации на том, что означает простой пароль. (Длина, кодировки и т. Д.) Мой запрос будет SELECT string FROM table WHERE hash = 'hash' – John

+0

@John. , , Но слабый пароль может хешировать так же, как сильный. Кроме того, я думаю, что существует слишком много правил - например, повторение буквы «n» раз или использование чьего-то имени и так далее. –

+0

Столкновение хэшей очень маловероятно, даже в MD5. Кроме того, да, я рассмотрел эту «n» вещь. Мой вопрос касался производительности. – John

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