Частично проблема может заключаться в оригинальном дизайне схемы: внешние ключи указывают неверный путь, обрабатывая адреса, номера телефонов и т. Д. Как главные, а не детали. Это может быть удобно, если вы хотите, чтобы все варианты использования определенного адреса обновлялись одновременно, но, по моему опыту, это всегда превращается в слишком много сложных исключительных случаев, например, один человек в каком-либо месте перемещается, поэтому вам нужно разорвать их связь с целым переезд в дом или офис, чтобы вы обновили существующую запись. Если вы попытаетесь скрыть эту деталь от пользователя на экране CRUD, вы окажетесь в ситуации, когда он просто не будет делать то, что вы хотите.
Если это сделано таким образом, чтобы просто свернуть дублирующиеся значения, это фактически денормализация базы данных: само существование строки адреса не имеет смысла. Единственное отличие состоит в том, что в отличие от большинства денормализаций, он пытается получить космическую эффективность, а не скорость. Создание таблицы ссылок на этом этапе просто усугубляет проблему.
Если вы хотите, например, несколько адресов на контакт, сделайте адреса в таблице подробностей с внешним ключом, указывающим на родительский контакт, и не беспокойтесь о дублированных значениях адресов, потому что это просто значения . В противном случае, сделайте Address реальной сущностью: добавьте поле заголовка или описания и экран CRUD, чтобы он мог стоять сам как сущность.