Модель данных для перечисления со связанными значениями - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь выяснить, каков рекомендуемый способ реализации 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.

См. Диаграмму:

enter image description here

Интересно, это правильный способ сделать это, и у меня есть несколько конкретных 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? Если это так, то он будет удален автоматически. Я думаю, что реальный вопрос здесь в том, применимо ли правило удаления к обновлению отношений или нет. Я сделаю некоторые эксперименты на этом позже сегодня.

1 Ответ

0 голосов
/ 07 января 2020

Несколько мыслей ...

1) Какой типичный способ реализации enum со связанными значениями?

Я думаю, что мой вышеупомянутый модальный режим хорош. Но на всякий случай, есть ли другие лучшие способы сделать это?

Я не могу комментировать типичные способы реализации перечислений со связанными значениями, но ваша модель, кажется, имеет смысл. Одно слово предостережения: если вы будете искать в StackOverflow вопросы, касающиеся наследования сущностей, вы найдете несколько ответов, которые не рекомендуют его использовать. CD реализует субэлементы (по крайней мере, для хранилищ SQLite), чтобы добавить все атрибуты всех субэлементов в таблицу SQLite родительского объекта. Это обрабатывается для вас «под капотом» с помощью CoreData, но таблица SQLite потенциально может оказаться очень «широкой», что может повлиять на производительность. Я никогда не считал это проблемой, но вы можете иметь это в виду, если у вас много данных и / или объекты более сложные, чем вы указали в вопросе. Субъекты также могут вызывать проблемы в некоторых редких ситуациях - например, я видел вопросы, указывающие на проблемы с ограничениями уникальности.

2) Является ли сущность без атрибутов нормальной?

Это необычно, но не проблема. Тем не менее, поскольку все три субъекта имеют атрибуты date и who, было бы целесообразно переместить их из подразделов в родительский объект WhereItComeFrom. (В противном случае, как отмечалось выше, ваша таблица родительских сущностей будет иметь три столбца для date (по одному для каждой сущности) и три для who).

3) Будет ли удален старый объект автоматически при изменении отношения во время выполнения?

Нет. Если вы изменяете значение отношения book.whereItCameFrom во время выполнения, когда объект GivenAsGift заменяет объект Borrowed, управление графами на компакт-диске гарантирует, что для свойства Borrowed объекта book установлено значение nil. Каскадное правило не запрещает таким образом «осиротеть» объекты, и вы должны вручную удалить объект Borrowed.

...