Я бы добавил логическое поле «удалено» (или что-то еще более необычное, например, дату и время удаления) в модель контактов, чтобы контакты никогда не удалялись физически, а только «логически» удалялись, когда это полеустановлено.(Это также позволяет вам предлагать другие интересные функции, такие как «показывать мои старые удаленные контакты», «восстановить» и т. Д., Если хотите).
Это общий подход во всех системах хранения, которыетребуется поддерживать историческую целостность (и / или аналогичные требования, такие как «проверяемость»).
В тех случаях, когда огромное количество логически удаленных объектов угрожает производительности системы, классическая альтернатива состоит в том, чтобы иметь отдельный,идентичная модель "DeletedContacts", но ограничения внешнего ключа требуют больше работы, например, класс Message должен иметь и recipients
, и deleted_recipients
поля , если вам нужна целостность внешнего ключа (но с использованием только ключей, каквы делаете, эта дополнительная работа не понадобится).
Я сомневаюсь, что средний пользователь удалит такой огромный процент своих контактов, чтобы гарантировать оптимизацию, описанную в предыдущем абзаце, поэтому в этом случае ябы перейти с простым «удаленным» полем.