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

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

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

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

Поток образцов пары:


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

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

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

Благодаря!

Solutions Collecting From Web of "Как проверить уникальность коллекции «многие-ко-многим»?"

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

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

В моем приложении я сделаю следующий шаг:

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

      foreach ($ input as $ input)
     {
       if (! in_array ($ input, $ collection))
       {
         // вставить здесь
       }
     } 

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

  foreach ($ collection as $ data)
 {
   if (! in_array ($ data, $ input))
   {
     // удалить
   }
 } 

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