Понимание направления отношений между полями модели в 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, то мне придется делать обратные связи по всему пути вниз, верно? Кажется, что каждое направление имеет свой компромисс.

Правильно ли я рассуждаю? Как должна быть структурирована архитектура и почему? Что еще я могу здесь упустить и по каким причинам я мог бы построить модели другим способом?

Спасибо за помощь!

Вернуться на верх