Вот желаемый поток моего PHP-приложения (да, это расплывчато, но это проще):
(Объекты и коллекции много-ко-многим, поэтому есть таблица объектов, таблица коллекций и таблица, связанная с ними.)
Поток образцов пары:
Шаги 1 и 3 просты. Шаг 2 – это то, где я не уверен, как действовать дальше. Кажется излишне тяжелым для базы данных запрашивать отношение для наборов, содержащих эти точные идентификаторы, поэтому я собираюсь опубликовать несколько очевидных решений, таких как простой список идентификаторов и хеширование, но мне также хотелось бы узнать, есть ли еще идеальные решения там.
Благодаря!
Одним из очевидных решений является сохранение списка идентификаторов детей в строке базы данных коллекции, например 1111,1112,1113,1114,1115
. Это быстро, легко и гарантирует уникальность, но я думаю, что для сравнения списков, подобных этому, было бы излишне тяжело сравнивать CPU, особенно если они затянутся, не говоря уже о том, что это довольно много дублирования, когда дело доходит до места для хранения.
Еще один очевидный ответ – взять ту же конкатенированную строку и взять хэш MD5 – быстро и просто, но управляет (предоставленным, небольшим) риском столкновения. Хеширование стоит использовать по характеру более коротких строк, хотя я мог бы легко получить 100% гарантию того, что у вас не будет столкновений, а не хеширования?
В моем приложении я сделаю следующий шаг:
$collection = array('111', '112', '113', '114');
Я буду проверять новый ввод пользователя в два этапа. Первый шаг – посмотреть, уже ли это в базе данных или нет. Если это не так, тогда вставьте. В противном случае игнорируйте:
foreach ($ input as $ input) { if (! in_array ($ input, $ collection)) { // вставить здесь } }
Затем во втором цикле я делаю это в обратном порядке, чтобы удалить данные, которые не были выбраны пользователем.
foreach ($ collection as $ data) { if (! in_array ($ data, $ input)) { // удалить } }
В вашем случае вам может понадобиться или не понадобиться второй цикл. Мне это нужно, поскольку я делаю ввод как флажки, который пользователь может выбрать для активации / деактивации, поэтому я переводил его как вставку и удаление.