выглядит хорошо, за исключением всех атрибутов "xxxID", например caveID
. Вам также необходимо следовать соглашениям об именах.
У вас одинаковые имена атрибутов с (предположительно) одинаковыми значениями в двух или более объектах. Это необходимо в SQL для объединений, но в Core Data это обрабатывается объектами и отношениями.
Каждый объект в Базовых данных автоматически универсально уникален. Это означает, что когда вы создаете отношение от одного объекта к другому, это отношение конкретно идентифицирует конкретный уникальный объект.
Это означает, что вам нужен только атрибут типа caveID
в реальной сущности, который caveID
обозначает, который в этом случае (предположительно) является сущностью Caves
. Вам не нужен атрибут в сущности CavesConditions
или любой другой сущности, которая имеет отношение к сущности "Пещеры".
(Если бы xxxID
были просто артефактами SQL, на самом деле они не нужны в Core Data, если только некоторые внешние базы данных, с которыми ваше приложение взаимодействует, не требуют их.)
Хорошее практическое правило заключается в том, что любое конкретное значение должно отображаться только на одной стороне отношения и, в идеале, только один раз во всей модели данных.
Соглашения об именах немного отличаются от SQL. Базовая сущность данных не является таблицей. Сущность больше похожа на класс. Предполагается, что каждая сущность описывает отдельный экземпляр управляемого объекта. Сколько из этих экземпляров попадает в граф объектов, не имеет значения. Поэтому имена сущностей являются единственными.
В этом случае Caves
должно быть Cave
, Countries
должно быть Country
и так далее.
Отношения названы в честь сущности, на которую они нацелены. Это не очевидно сразу, но каждое взаимное отношение (по умолчанию) в редакторе визуальной модели данных на самом деле представляет собой два отношения, потому что для каждой стороны существует одно описание отношений. У каждой стороны есть название целевого объекта. По соглашению отношения «один к одному» имеют единственное имя, а отношение «многие» имеет множественное имя.
Итак:
Caves.relConditions<-->>CaveConditons.getCave
... станет
Cave.conditons<-->>CaveConditon.cave
Соглашения об именах важны, потому что Objective C использует имена соглашений для генерации и поиска методов доступа.