Каков наилучший способ проверить наличие дублирующих текстовых полей в MYSQL / PHP? - PullRequest
4 голосов
/ 04 февраля 2011

Мой код извлекает ~ 1000 HTML-файлов, извлекает соответствующую информацию и затем сохраняет эту информацию в поле MySQL TEXT (поскольку оно обычно довольно длинное). Я ищу систему для предотвращения дублирования записей в БД

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

Вторая идея - хранить длину файла (в байтах или символах или что-то еще), индексировать ее и проверять наличие дублирующихся длин файлов, перепроверять содержимое, если найдена дублирующаяся длина.

Понятия не имею, что является лучшим решением с точки зрения производительности. Возможно, есть лучший способ?

Если есть эффективный способ проверить, похожи ли файлы> 95%, это было бы идеально, но я сомневаюсь, что есть?

Спасибо за любую помощь!

Кстати, я использую PHP5 / Kohana


EDIT:

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

Например: 17aB ... = 1a, 7b, 10c, 27c, ...

потенциальной проблемой будет верхний предел для количества символов (около 61?)

Я предполагаю, что ложные срабатывания все еще будут редкостью. , .

хорошая идея / плохая идея?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Идея хеширования, вероятно, лучшая.У вас могут быть коллизии, но они будут крайне редки.

Сделайте поле хеш-функции уникальным ключом для таблицы и поймайте дублирующийся код ошибки.Или используйте insert ignore или insert replace.

0 голосов
/ 04 февраля 2011

Звучит неплохо, я реализовал нечто подобное.Поле хеша должно быть ключевым, поскольку дубликаты не допускаются.

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

MD5 - это 16 байтов.Сколько потенциальных хэшей будет со временем?Если это число остается разумным, вы должны делать сравнение в памяти.

...