Первое, что вы хотите сделать, это очистить именование в вашей модели данных. Помните, что здесь вы имеете дело с уникальными объектами, а не с именами таблиц, столбцов, строк, объединений и т. д. в SQL. Таким образом, вам не нужно добавлять ко всему префикс «Основной» (если только у вас нет нескольких видов объектов «Предложение», «Группа» и «Элемент»).
Имена сущностей начинаются с прописных букв, имена атрибутов и связей — со строчных. Все имена сущностей являются единственными, потому что моделирование сущности не зависит от того, сколько экземпляров сущности будет или какие у нее будут отношения. Имена отношений «к одному» должны быть в единственном числе, а ко многим — во множественном числе. Эти соглашения упрощают чтение кода и позволяют передавать информацию о модели данных без необходимости просмотра самой графики.
Итак, мы могли бы очистить вашу существующую модель, например:
Offer{
id:string
title:string
groups<-->>Group.offer
}
Group{
title:string
displayOrder:number
offer<<-->Offer.groups
items<-->>Item.group
}
Item{
title:string
displayOrder:number
isSelected:Bool
group<<-->Group.items
}
Теперь, если вы прочитаете ключевой путь в коде, который идет AnOfferObj.groups.items
, вы можете сразу сказать, что проходите два отношения ко многим, не зная ничего больше о модели данных.
Мне неясно, что именно вы хотите, чтобы ваши «Оценки» «скопировали». Похоже, вы либо хотите, чтобы они «скопировали» весь график любого Offer
, либо хотите, чтобы они «скопировали» набор Item
объектов.
В любом случае решение состоит в том, чтобы создать объект Evaluation
, который может формировать отношения либо с Offer
, либо с Item
.
В первом случае это будет выглядеть так:
Evaluation{
title:string
offer<<-->Offer.evaluations
}
Offer{
id:string
title:string
groups<-->>Group.offer
evaluations<-->>Evaluation.offer
}
... и во втором случае:
Evaluation{
title:string
items<<-->>Item.evaluations
}
Item{
title:string
displayOrder:number
isSelected:Bool
group<<-->Group.items
evaluations<<-->>Evaluation.items
}
Обратите внимание, что ни в том, ни в другом случае вы ничего не дублируете и не копируете. Вы просто создаете ссылку на существующую группу объектов. В первом случае вы найдете все связанные объекты Item
для конкретного объекта Evaluation
, пройдя по ключевому пути offer.groups.items
. Во втором случае вы прошли бы только ключевой путь отношения items
объекта Evaluation
с items
.
Обратите внимание, что способ отображения всего этого в пользовательском интерфейсе не зависит от модели данных. Когда у вас есть объекты на руках, вы можете сортировать или иным образом упорядочивать их по мере необходимости, исходя из потребностей используемого в данный момент представления.
Несколько советов на прощание: Core Data — это не SQL. Сущности не являются таблицами. Объекты не являются строками. Атрибуты не являются столбцами. Отношения не являются соединениями. Core Data — это система управления объектным графом, которая может сохранять или не сохранять объектный граф и может использовать или не использовать SQL для этого. Попытка думать о Core Data в терминах SQL приведет к тому, что вы совершенно неправильно поймете Core Data, что приведет к большому огорчению и напрасной трате времени.
По сути, забудьте все, что вы знали о SQL. Эти знания не помогут вам понять Core Data и будут активно препятствовать вашему пониманию их.
10.06.2011