Как проверить уникальность коллекции «многие ко многим»? - PullRequest
0 голосов
/ 19 января 2010

Вот требуемый поток моего 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, где я не уверен, как поступить. Кажется излишне тяжелым для базы данных запрашивать отношения для наборов, содержащих эти точные идентификаторы, поэтому я собираюсь опубликовать несколько очевидных решений, таких как простой список идентификаторов и хеширование, но я также хотел бы знать, есть ли еще идеальные решения там.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 19 января 2010

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

0 голосов
/ 24 января 2010

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

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

    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 голосов
/ 19 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...