Реализация изменения записи в таблице связи с составным primary key?
перед сохранением достаём из базы то что есть по ключу a_id и 
сравниваем с тем что пришло от пользователя. Используя array_diff() и прочие ухищрение находим те строки, которые нужно удалить и те которые нужно добавить. Если их кол-во одинаковое (если форма подразумевает функции обновления то так оно и будет), то можно заменить одним запросом на update. 

Усложняется логика, но нет массового удаление как вы описали в пункте 3)
Второй и третий варианты вполне жизненны.
Не написали, что за БД. Самое простое — поставить каскадное изменение (если есть). Или сделать каскад через триггеры (если есть).
Но если малой кровью, то третий вариант не плох, можно смело использовать.
Первый вариант совсем не годится.