Как проверить уникальность коллекции «многие ко многим»?

0

Вот желаемый поток моего PHP-приложения (да, он неопределенный, но это проще):

  • Пользователь отправляет набор, скажем, около 5 объектов по целым идентификаторам. (Это будет больше похоже на 15, но пусть говорят 5 для удобства.)
  • Приложение проверяет, была ли эта коллекция ранее отправлена, и сохраняет ее в базе данных MySQL, если не
  • Приложение сохраняет эти объекты в базе данных, если они не были сохранены до

(Объекты и коллекции много-ко-многим, поэтому есть таблица объектов, таблица коллекций и таблица, связанная с ними.)

Несколько потоков образцов:


  • Пользователь отправляет 111, 112, 113, 114
  • Этот набор является новым! Коллекция сохраняется.
  • Мы видели объекты 111 и 112, но извлекаем и сохраняем данные для 113 и 114, так как у нас их нет.

  • Другой пользователь отправляет 111, 112, 113, 114
  • Мы уже видели эту коллекцию. Не беспокойтесь о сохранении.
  • Поскольку мы видели коллекцию, мы, очевидно, видели объекты. Не беспокойтесь о сохранении.

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

Спасибо!

Теги:
hash

3 ответа

0

В моем приложении я сделаю этот шаг:

  • После отправки пользователя и перед входом в базу данных я буду извлекать данные из базы данных в массив. В приведенном выше примере у меня будет $collection = array('111', '112', '113', '114');
  • Я буду проверять ввод нового пользователя на два шага. Первый шаг - посмотреть, уже ли это в базе данных или нет. Если это не так, тогда вставьте. В противном случае игнорируйте:

    foreach ( $inputs as $input )
    {
      if ( ! in_array($input, $collection) )
      {
        //do insert here
      }
    }

Затем во втором цикле я делаю это в обратном порядке, чтобы удалить данные, которые не были выбраны пользователем.

foreach ( $collection as $data )
{
  if ( ! in_array($data, $inputs) )
  {
    //do delete here
  }
}

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

0

Одним из очевидных решений является сохранение списка идентификаторов детей в строке базы данных коллекции, например 1111,1112,1113,1114,1115. Это быстро, просто и гарантирует уникальность, но я полагаю, что для сравнения списков, подобных этому, было бы излишне тяжело сравнивать CPU, особенно если они затягиваются, не говоря уже о том, что это довольно много дублирования, когда дело касается пространства для хранения.

0

Еще один очевидный ответ - взять ту же конкатенированную строку и взять хэш MD5 - быстро и просто, но запускает (предоставленный, небольшой) риск столкновения. Хеширование стоит использовать по характеру более коротких строк, хотя я мог бы легко получить 100% гарантию того, что у вас не будет столкновений, а не хеширования?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню