Создать архитектуру класса на основе ERD
Для простоты: допустим, у вас есть диаграмма отношений сущностей (ERD) со следующими таблицами:
Survey
: Имя, имя, вопросы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.
]