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