2011-06-04 8 views
0

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

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

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

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

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

ответ

0

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

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 на одно отношение без сирота объекта на другом.

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

Смежные вопросы