Основные данные: взаимосвязь и модель «Ко многим»

#objective-c #cocoa #macos #core-data

#objective-c #cocoa #macos #основные данные

Вопрос:

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

У меня есть объект под названием «ProjectFile», который обладает некоторыми базовыми строковыми свойствами. (Одним из них является путь к файлу на диске — назовем его «File X» — которым будет управлять мое приложение.) Однако, когда приложение манипулирует файлом X, ему также может потребоваться манипулировать ДРУГИМИ файлами — fileY и fileZ.

FileY и FileZ, как и FileX, будут объектами «ProjectFile». Итак, мне нужен способ сообщить основным данным, что «FileY и FileZ связаны с FileX». Чтобы сделать это, я создал связь для объекта «ProjectFile» под названием «linkedFiles» и установил назначение на «ProjectFile», а обратное — на «linkedFiles». Затем я устанавливаю это как связь «ко многим», поскольку каждый «файл проекта» может содержать несколько связанных файлов.

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

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

Ответ №1:

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

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

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

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

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

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

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