Понимание направления отношений между полями модели в Django
Я использую Django уже довольно давно, но не уверен, что полностью понимаю, как должны работать отношения. лучше всего это описать на примере, так что вот. Предположим, есть Company, который имеет несколько Departments, и каждый Department может иметь несколько Role в нем. Затем, каждый Role может иметь несколько Employees.
Возникают вопросы о том, как должны быть расположены поля при доступе к данным. Некоторые из возникающих вопросов могут показаться очевидными и могут быть лучше поняты, когда я их напишу, но не мешайте мне, потому что я использую это для обучения.
Должно быть:
Пример 1 (избыточный):
class Company(models.Model):
name = charfield
departments = m2m(Department)
roles = m2m(Role)
employees = m2m(Employee)
class Department(models.Model):
name = charfield
roles = m2m(Role)
employees = m2m(Employee)
class Role(models.Model):
name = charfield
employees = m2m(Employee)
class Employee(models.Model):
name = charfield
Пример 2 (не избыточный):
class Company(models.Model):
name = charfield
departments = m2m(Department)
class Department(models.Model):
name = charfield
roles = m2m(Role)
class Role(models.Model):
name = charfield
employees = m2m(Employee)
class Employee(models.Model):
name = charfield
Пример 3 (поля смотрят вверх):
class Company(models.Model):
name = charfield
class Department(models.Model):
name = charfield
company = FK(Company)
class Role(models.Model):
name = charfield
department = FK(Department)
class Employee(models.Model):
name = charfield
role = FK(Role)
Пример 4 (избыточный, поля смотрят вверх):
class Company(models.Model):
name = charfield
class Department(models.Model):
name = charfield
company = FK(Company)
class Role(models.Model):
name = charfield
department = FK(Department)
company = FK(Company)
class Employee(models.Model):
name = charfield
role = FK(Role)
deparment = FK(Department)
company = FK(Company)
Мне кажется, что #3 - лучший вариант, поскольку каждый Employee принадлежит Role, и если мне нужно получить доступ к Department или Company, связанным с этим Employee, я могу получить его через employee.role.department.company. Но тогда возникает вопрос о том, как будет осуществляться доступ к обратным связям; если у меня есть Company и мне нужно получить все Employee, то мне придется делать обратные связи по всему пути вниз, верно? Кажется, что каждое направление имеет свой компромисс.
Правильно ли я рассуждаю? Как должна быть структурирована архитектура и почему? Что еще я могу здесь упустить и по каким причинам я мог бы построить модели другим способом?
Спасибо за помощь!