Вот желаемый поток моего PHP-приложения (да, он неопределенный, но это проще):
(Объекты и коллекции много-ко-многим, поэтому есть таблица объектов, таблица коллекций и таблица, связанная с ними.)
Несколько потоков образцов:
Шаги 1 и 3 просты. Шаг 2 - это то, где я не уверен, как действовать дальше. Кажется излишне тяжелым для базы данных запрашивать отношение для наборов, содержащих эти точные идентификаторы, поэтому я собираюсь опубликовать несколько очевидных решений, таких как простой список идентификаторов и хеширование, но мне также хотелось бы узнать, есть ли еще идеальные решения там.
Спасибо!
В моем приложении я сделаю этот шаг:
$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 } }
В вашем случае вам может понадобиться или не понадобиться второй цикл. Мне это нужно, поскольку я делаю ввод как флажки, которые пользователь может выбрать для активации/деактивации, поэтому я переводил его как вставку и удаление.
Одним из очевидных решений является сохранение списка идентификаторов детей в строке базы данных коллекции, например 1111,1112,1113,1114,1115
. Это быстро, просто и гарантирует уникальность, но я полагаю, что для сравнения списков, подобных этому, было бы излишне тяжело сравнивать CPU, особенно если они затягиваются, не говоря уже о том, что это довольно много дублирования, когда дело касается пространства для хранения.
Еще один очевидный ответ - взять ту же конкатенированную строку и взять хэш MD5 - быстро и просто, но запускает (предоставленный, небольшой) риск столкновения. Хеширование стоит использовать по характеру более коротких строк, хотя я мог бы легко получить 100% гарантию того, что у вас не будет столкновений, а не хеширования?