Создать архитектуру класса на основе ERD

Для простоты: допустим, у вас есть диаграмма отношений сущностей (ERD) со следующими таблицами:

  1. Survey: Имя, имя, вопросы
  2. Question: Id, текст, опрос

В этом случае Survey имеет один или несколько Questions и Question принадлежит только одному Survey,

Мой вопрос заключается в том, могу ли я воссоздать эту архитектуру, используя только классы без какого-либо слоя постоянства, такого как данные Realm или Core? Это простая демонстрация того, что я имею в виду:

struct Survey {
    var id: Int
    var name: String
    var questions: [Question] // 1 or more questions
}

struct Question {
    var id: Int
    var text: String
    var survey: Survey // belongs to only one survey
}

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

let survey = Survey(id: 0, name: "First survey", questions: [
        Question(id: survey.id, text: "Whats your name", survey: survey) // This is not possible.
])

Дополнительные сведения: я хочу создать приложение для опроса. Архитектуру приложения сложно спроектировать, поскольку опрос будет поддерживать несколько типов вопросов (множественный выбор, открытые вопросы, вопросы да / нет и т. Д.). Делая поиск в Интернете, я обнаружил, что есть несколько вариантов ERD для опроса, подобного этому. Проблема в том, что этот дизайн ERD предназначен для баз данных... но я не хочу сейчас создавать базу данных. Я предполагаю, однако, что архитектурно дизайн может быть представлен с использованием классов. Итак, вопрос в том, как?

1 ответ

У вас есть зависимости между этими двумя объектами, так как инициализатор для обеих структур ожидает, что другие будут созданы раньше, это просто ошибка в дизайне. Вы можете справиться с такого рода зависимостями, используя дополнительные или неявно развернутые дополнительные (что небезопасно).

Вот один очевидный способ решить это,

struct Survey {
  var id: Int
  var name: String
  var questions: [Question]! // 1 or more questions

  init(id: Int, name: String) {
    self.id = id
    self.name = name
  }
}

struct Question {
  var id: Int
  var text: String
  var survey: Survey // belongs to only one survey
}

Таким образом, вместо передачи объекта внутри инициализатора, вы можете создать один объект без необходимости создавать другую структуру и просто использовать присваивание.

var survey = Survey(id: 0, name: "First survey")
survey.questions = [
    Question(id: survey.id, text: "Whats your name", survey:survey) // This is not possible.
]
Другие вопросы по тегам