Основные данные: отношения и модель для многих - PullRequest
0 голосов
/ 04 июня 2011

Я рассматриваю возможность использования Core Data для приложения, которое пишу.Однако после прочтения документации я не уверен, как смоделировать конкретные отношения.Вот основы:

У меня есть объект с именем "ProjectFile", который имеет некоторые базовые свойства строки.(Одним из них является путь к файлу на диске - назовите его «Файл X», которым будет манипулировать мое приложение.) Однако, когда приложение манипулирует файлом X, ему также может понадобиться манипулировать другими файлами -- fileY и fileZ.

FileY и FileZ, как и fileX, будут объектами "ProjectFile".Поэтому мне нужен способ сообщить Core Data «FileY и FileZ связаны с FileX».Чтобы сделать это, я создал связь с сущностью «ProjectFile», которая называется «connectedFiles», и установил для пункта назначения «ProjectFile», а в качестве обратного - «connectedFiles».Затем я устанавливаю это как отношение «ко-многим», поскольку каждый «ProjectFile» может иметь несколько связанных файлов.

Мне это кажется рекурсивным, и я не уверен, что сделал это правильно.«Связанные» файлы (fileY и fileZ) должны существовать самостоятельно, как и fileX.Мне нужно иметь возможность "удалить" их из отношения "connectedFiles", но они все еще существуют отдельно, если это имеет смысл.По сути, мне просто нужны слабые отношения между отдельными объектами в моей модели.

Правильно ли я это сделал или я что-то упустил?Спасибо!

1 Ответ

0 голосов
/ 07 июня 2011

Итак, у вас есть модель данных, которая выглядит примерно так:

ProjectFile{
  path:string
  infile<<-->>ProjectFile.infile
}

Это будет работать, потому что (1) отношения базовых данных имеют направленность / мощность и (2) каждый объект уникален.Где вы можете попасть в проблему с правилами удаления.Вы в значительной степени должны использовать No Action или Nullify в этом случае, или рискуете отключить каскадное удаление.Это, в свою очередь, создает риск создания orphaned объектов, которые не имеют связей и которые трудно найти и удалить в графе объектов.

Лучшая модель будет кодировать больше информации в самих отношениях.Похоже, что реальные файловые объекты, которые вы моделируете, имеют две отдельные связи с другими файловыми объектами: (1) Каждый экземпляр имеет другие экземпляры, которыми он манипулирует, и (2) каждый экземпляр имеет другие экземпляры, которые им манипулируют.Итак, ваша модель должна отражать следующее:

ProjectFile{
  path:string
  toManipulateFiles<<-(nullify)->>ProjectFile.manipulatedByFiles
  manipulatedByFiles<<-(nullify)->>ProjectFile.toManipulateFiles
}

Это делает явным соотношение типов между объектами и позволяет быстро и легко получить нужные объекты для любой конкретной операции.Вы можете использовать Nullify в одной взаимосвязи, не ставя объект напротив другой.

Хотя это не сразу очевидно, отношения - это не просто линии на графической модели, это реальные живые объекты, которые могут нести много информации.Вы должны разработать с учетом этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...