Я работаю над своим первым проектом Core Data (на iPhone), и он мне действительно нравится. Core Data - это классная штука.
Я, однако, сталкиваюсь с трудностями проектирования, которые я не знаю, как решить, хотя я предполагаю, что это довольно распространенная ситуация. Это касается модели данных.
Для ясности я буду использовать воображаемое приложение для игры в футбол в качестве примера для иллюстрации своего вопроса. Скажем, что есть NSMO, которые называются Даунс и Плейс. Воспроизводит функции как шаблоны, которые будут использоваться Даунс. Пользователь создает Plays (например, Bootleg, Button Hook, Slant Route, Sweep и т. Д.) И заполняет различные свойства. У пьес много общего с Даунсом. Для каждого дауна пользователь решает, какую игру использовать. Когда выполняется Down, он использует Play в качестве шаблона. После каждого запуска он сохраняется в истории. Программа запоминает все когда-либо сыгранные Дауны.
Пока все хорошо. Это все работает нормально.
Вопрос, который у меня возникает, касается того, что происходит, когда пользователь хочет изменить детали воспроизведения. Допустим, изначально это был проход слева, но теперь пользователь хочет, чтобы это был проход справа. Однако внесение этого изменения не только влияет на все последующие исполнения этой пьесы , но также меняет сведения о пьесах, сохраненных в истории . Запись «Даунс» становится «загрязненной», потому что шаблон Play был изменен.
Я обошел несколько возможных исправлений этой ситуации, но я представляю, что гении SO знают гораздо больше о том, как справиться с этим, чем я. Тем не менее, потенциальные исправления, которые я придумал:
«Управление версиями» пьес. Каждое изменение в шаблоне Play фактически создает новый отдельный объект Play с тем же именем (насколько пользователь может судить). Однако под капотом это на самом деле другая игра. Это работает, AFAICT, но кажется, что это может потенциально привести к дикому распространению объектов Play, особенно. если пользователь продолжает переключаться между несколькими версиями одного и того же Play (создание объекта за объектом каждый раз, когда пользователь переключается). Да, приложение может проверять наличие уже существующих идентичных пьес, но ... это просто беспорядок.
При сохранении записывайте детали, которые они использовали для воспроизведения, но не в качестве объекта воспроизведения. Это просто кажется смешным, учитывая, что объект Play находится там , чтобы хранить только эти детали.
Признайте, что объекты Play на самом деле выполняют 2 функции: одну для шаблона Down, а другую для записи того, какой шаблон был использован. Эти 2 функции имеют разные отношения с Down. Первый (шаблон) имеет отношение ко многим. Но вторая (запись) имеет отношение один к одному. Это будет означать создание второго объекта, что-то вроде «Play-Template», который сохранит связь «многие-многие» с Даунами. Игровые объекты будут переконфигурированы, чтобы иметь отношение один к одному с Даунами. A Down будет использовать объект Play-Template для выполнения, но использовать новый тип объекта Play для хранения того, какой шаблон был использован. Именно это изменение отношения «многие ко многим» к отношениям «один к одному» и составляет суть проблемы.
Даже написание этого вопроса помогло мне прояснить ситуацию. Я думаю, что что-то вроде решения 3 является ответом. Однако, если у кого-то есть идея получше или просто подтверждение, что я на правильном пути, это было бы полезно. (Помните, я на самом деле не создаю футбольную игру, просто использовать метафору быстрее / проще для всех).