Первое, что вы хотите сделать, это очистить именование в вашей модели данных. Помните, что здесь вы имеете дело с уникальными объектами, а не с именами таблиц, столбцов, строк, объединений и т. Д. В SQL. Таким образом, вам не нужно ставить префикс перед «Core» (если у вас нет нескольких видов сущностей «Предложение», «Группа» и «Предмет»).
Имена объектов начинаются с заглавных букв, имена атрибутов и отношений с нижнего регистра. Все имена сущностей единичны, потому что моделирование сущности не зависит от того, сколько экземпляров сущности будет или какие у нее будут отношения. Имена отношения один к одному должны быть единственными, а ко многим множественными. Эти соглашения делают код легким для чтения и передачи информации о модели данных без необходимости видеть фактическую графику.
Итак, мы можем очистить вашу существующую модель как:
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
.
Обратите внимание, что то, как вы в конечном итоге отобразите все это в пользовательском интерфейсе, не зависит от модели данных. Когда у вас есть объекты в руках, вы можете сортировать или иным образом упорядочивать их по мере необходимости в соответствии с потребностями вида, используемого в данный момент.
Несколько советов: основные данные - это не SQL. Сущности не являются таблицами. Объекты не являются строками. Атрибуты не являются столбцами. Отношения не объединяются. Базовые данные - это система управления графом объектов, которая может сохранять или не сохранять объектный граф, а может и не использовать SQL для этого далеко за кулисами. Попытка представить базовые данные в терминах SQL приведет к тому, что вы полностью неправильно поймете базовые данные и приведет к большим трудностям и потерянному времени.
В общем, забудьте обо всем, что вы знаете о SQL. Эти знания не помогут вам понять основные данные и будут активно препятствовать вашему пониманию.