Поддержание целостности основных объектов данных с множеством входящих связей «один ко многим» - PullRequest
1 голос
/ 04 июня 2010

У меня есть Базовое хранилище данных, которое содержит несколько объектов MediaItem, которые хорошо описывают элементы мультимедиа. У меня также есть NewsItems, которые имеют отношение один ко многим к ряду MediaItems. Пока все хорошо.

Однако у меня также есть PlayerItems и GalleryItems, которые также имеют отношение один-ко-многим к MediaItems. Таким образом, MediaItems совместно используются объектами.

Учитывая, что многие сущности могут иметь отношения один ко многим, как я могу установить взаимные отношения от MediaItem ко всем (1 или более) сущностям, которые имеют к нему отношения, и, кроме того, как я могу реализовать правила удалить MediaItems, когда число этих взаимных связей падает до 0?


Для записи (и в случае, если она пригодится кому-то еще), я решил эту проблему, создав абстрактный класс MediaLinkedEntity с отношением один-ко-многим к MediaItems (с именем MediaItems в MediaLinkedEntity конец и LinkedEntities на конец MediaItem). Затем я создал подкласс этой сущности для NewsItems и GalleryItems и реализовал следующий метод -prepareForDeletion в MediaLinkedEntity:

- (void)prepareForDeletion {

    NSSet *mediaItems = self.MediaItems;
    NSSet *linkedEntities;

    // step through all media items we link to
    for( MediaItem *mediaItem in mediaItems ){
        linkedEntities = mediaItem.LinkedEntities;
        if( [ linkedEntities count ] == 1 && [ linkedEntities containsObject: self ] ){
        // if this MediaLinkedEntity is the only entry in the mediaItem's linked entities list, delete it.
            [ mediaItem.managedObjectContext deleteObject: mediaItem ];
        }
    }   

    [ super prepareForDeletion ];
}

По сути, следуя ответу Маркуса ниже.

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Лучший ответ для этого - иметь абстрактную родительскую сущность, которая обрабатывает отношения общим способом. Это позволит вам уменьшить количество связей в вашей модели.

Что касается правила удаления, вы должны создать подкласс для "одной" стороны отношений и реализовать их метод -prepareForDeletion для проверки потерянных элементов на множестве сторон, а затем удалить их, когда это произойдет.

0 голосов
/ 04 июня 2010

Однако у меня также есть PlayerItems и GalleryItems, которые также имеют отношение один-ко-многим к MediaItems. Таким образом, MediaItems являются общими для всех сущностей.

Самый простой, но не очень красивый способ - создать обратные отношения для каждого из отношений MediaItem.

Другой возможностью было бы создание абстрактной родительской сущности с отношением к MediaItem и наследование GalleryItem, NewsItems, PlayerItem от этой общей сущности.

Учитывая, что многие сущности могут иметь отношения один ко многим, как я могу установить взаимные отношения от MediaItem ко всем (1 или более) сущностям, которые имеют к нему отношения, и, кроме того, как я могу реализовать правила удалить MediaItems, когда число этих взаимных отношений падает до 0?

Есть несколько способов создать это поведение. Вы можете использовать KVO для наблюдения всех обратных отношений MediaItem

...