Я пытаюсь выяснить, каков рекомендуемый способ реализации enum со связанными значениями в модели данных Core Data. Допустим, у меня есть сущность книги, и я хочу сохранить в базе данных, как я получил книгу, например:
- она куплена мной (или другими членами семьи)
- заимствована у кто-то (например, коллега)
- это кому-то подарили (например, друг)
Это будет перечисление в swift:
enum WhereItCameFrom {
case Bought(who: String, date: Date, where: String)
case Borrorwed(who: String, date: Date, dueDate: Date)
case GivenAsGift(who: String, date: Date, forWhat: String)
}
Я думаю реализовать его в модели данных с использованием наследования, как показано ниже:
Введите родительский объект WhereItCameFrom
и определите вышеупомянутые случаи как его дочерние объекты.
Определение отношения to-one
от Book
до WhereItCameFrom
. Правило удаления: Cascade
.
Определение отношения to-one
от WhereItCameFrom
до Book
. Правило удаления: Deny
.
См. Диаграмму:
Интересно, это правильный способ сделать это, и у меня есть несколько конкретных c вопросов.
1) Каков типичный способ реализации enum со связанными значениями?
Я думаю, что мой вышеупомянутый модальный хорошо. Но на всякий случай, есть ли другие лучшие способы сделать это?
2) Является ли сущность без атрибутов нормальной?
На приведенной выше диаграмме WhereItCameFrom
не имеет никаких атрибутов. Сначала я добавил к нему атрибут type
, чтобы указать, является ли он сущностью Bought
, Borrowed
или GivenAsGift
. Но затем я понял, что эта информация неявна в типе дочернего объекта, поэтому я удалил ее. Таким образом, единственной целью родительской сущности является сохранение отношений. Это типичное использование в Базовых данных?
3) Будет ли старый объект автоматически удаляться при изменении отношения во время выполнения?
Предположим, я изменяю значение отношения book.whereItCameFrom
во время выполнения. Его предыдущее значение - Borrowed
объект. Его новое значение - объект GivenAsGift
. Нужно ли удалять объект Borrowed
вручную (я имею в виду, делать это явно в коде приложения)?
Полагаю, мне следует это сделать. Но данные Core Data являются основой, помогающей поддерживать согласованность данных в графе объектов, что мне кажется неудобным. Интересно, есть ли в Core Data какая-то функция, которая может выяснить, что Borrowed
объект не нужен и удалить его автоматически?
Спасибо за любую помощь.
ОБНОВЛЕНИЕ:
В третьем вопросе, после того, как старый объект Borrowed
был отсоединен с объектом Book
, насколько я понимаю, правильно, что с точки зрения объекта Borrowed
равноправный объект был удален и, следовательно, равноправен Правило удаления Cascade
объекта применяется к объекту Borrowed
? Если это так, то он будет удален автоматически. Я думаю, что реальный вопрос здесь в том, применимо ли правило удаления к обновлению отношений или нет. Я сделаю некоторые эксперименты на этом позже сегодня.