Что такое релейшншипы в Core Data
Что проверяют
Умеете ли вы проектировать граф объектов, а не таблицы. Core Data это не обёртка над SQL: связи тут свойства сущностей, и от их настройки зависит, что произойдёт при удалении и сколько обращений уйдёт в хранилище при обходе списка.
Как отвечать
Связь (relationship) это атрибут сущности, указывающий на другую сущность. Кардинальность: to-one отдаёт объект, to-many отдаёт NSSet, то есть неупорядоченный набор; упорядоченность включается отдельно и даёт NSOrderedSet. Связь многие ко многим поддерживается напрямую, служебную таблицу Core Data создаёт сама.
Практически обязательное требование: у каждой связи должна быть обратная. Без неё Core Data не поддерживает целостность графа, неверно отрабатывают откат и отмена действия, а редактор модели выводит предупреждение. Односторонняя связь это осознанное исключение, а не экономия.
Правило удаления задаётся на каждой связи: Nullify обнуляет ссылку, Cascade удаляет связанные объекты, Deny запрещает удаление, пока связь не пуста, No Action оставляет граф в противоречивом состоянии и почти всегда ошибка проектирования.
Производительность: обращение к связи поднимает fault, поэтому обход выборки с чтением связанного поля превращается в множество отдельных запросов. Лечится предзагрузкой связей у запроса и разумным размером пакета выборки.
Где спотыкаются
Не задают обратную связь и потом ловят объекты, которые удалены, но всё ещё видны с другой стороны графа, плюс падения при сохранении контекста.
Не думают про правило удаления. Оставили значение по умолчанию, удалили родителя, дочерние записи остались сиротами и тихо растят файл базы. Обратный перекос не лучше: Cascade там, где связанные объекты нужны кому-то ещё, уносит чужие данные.
Передают объекты между потоками. NSManagedObject привязан к своему контексту и не потокобезопасен, между контекстами передаётся идентификатор объекта, а не сам объект; иначе краш приходит не сразу и воспроизводится плохо.