Избегайте циклических ссылок на отношения объектов ко многим

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

Думая об этих упражнениях, я могу это:

1- У меня есть упражнения, в которых есть несколько вопросов, которые имеют несколько альтернатив.
2- Конкретный вопрос может быть частью упражнений.
3- Конкретная альтернатива НЕ может быть частью нескольких вопросов.

С точки зрения отношений:

Упражнение < n-n> Вопрос
Вопрос < 1-н> Альтернатива

Я кодировал классы следующим образом:

class Exercise {
private $id;
private $name;
private $questions = []; //array of ExerciseQuestion
//...
}

class ExerciseQuestion {
private $id;
private $exercise = new Exercise();
private $question = new Question();
private $order; //handles question's order of appearance
//...
}

class Question {
private $id;
private $wording;
//...
}

class Alternative {
private $id;
private $question = new Question();
private $text;
//...
}

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

Проблема, которую я предвижу, заключается в том, что в отношении Упражнение-ExerciseQuestion-Вопрос, Я буду брошен в ад круговых ссылок. У меня будет упражнение с несколькими ExerciseQuestion, которое содержит экземпляр Exercise с большим количеством ExerciseQuestion внутри. Прав ли я в этом предположении?

Есть ли лучший или правильный способ выразить такие отношения? Стоит ли менять идентификаторы хранилищ вместо экземпляров или можно использовать какой-то шаблон проектирования?

-1

Решение

Если я правильно читаю вас, у вас на самом деле нет проблем. Если ваш домен включает в себя круговые или самореферентные отношения, то и ваши модели тоже должны.

Поскольку ваши объекты являются сущностями (они имеют идентичности), вам нужно позаботиться о том, чтобы для каждого идентификатора существовал только один экземпляр. Но пока вы соблюдаете это, они могут ссылаться друг на друга так, как вам нужно.

Теперь с циклическими ссылками может быть сложно справиться, если вам нужно пройти через граф объекта каким-либо исчерпывающим образом. В этом случае вам нужно позаботиться о том, чтобы не попасть в бесконечный цикл. Но если ваш домен на самом деле имеет эти отношения, то вам нужно смоделировать их, и вам придется реализовать какой-то способ обнаружения циклов и работы с ними. Детали будут проинформированы вашими конкретными потребностями.

2

Другие решения

Я не уверен, понимаю ли я то, что вы говорите, но если вы спрашиваете: это циклическая ссылка проблематично? ответ да нет, это зависит от того, что вы собираетесь делать и как вы решаете свою проблему.
Но если вы говорите о своей реализации, то ответ однозначно: нет, это не проблема, потому что атрибут class хранит не «объект», а «ссылку на объект», следовательно, нет круговой конструкции, которая привела бы к бесконечной рекурсивной итерации в вашем дело
Удачи

0

У вас есть проблема в вашей модели. В объекте отношения должны храниться только идентификаторы частей, участвующих в отношении, exerc_id и question_id, а также любые дополнительные атрибуты, которые применяются к отношению обоих объектов, например порядок. Вы не создаете экземпляры вовлеченных объектов в объекте отношений.

Чтобы быть точным, ваша модель ER такая

Exercise (id, name)
Question (id, wording)
ExerciseQuestion (exercise_id, question_id, order) // both ids
// form primary key
Alternative (id, text, question_id)

И ваши занятия должны следовать этому.

0
По вопросам рекламы [email protected]