Какой лучший способ организовать отношения в Джанго? Плоская или древовидная?
У меня есть 3 модели
client
loan
installment
- одна часть кредита
Должен ли я сделать:
loan-foreignKey(client)
installment-foreignKey(loan)
и получить клиентские взносы примерно так:
loans = client.loan.all()
result = array()
foreach(loans as loan):
result = result + loan.installments.all()
return result;
или я должен сделать это так:
loan-foreignKey(client)
installment-foreignKey(client)
installment-foreignKey(loan)
и просто:client.installment.all()
Первый способ выглядит более чистым с точки зрения программиста (без спагетти вокруг, без дублированных полей), но я беспокоюсь о производительности (вам нужно искать базу данных по всем кредитам, а затем по частям в этих кредитах)
2 ответа
Согласно Zen of Python: Flat лучше, чем вложенный. Вы должны думать о своих моделях как об объектах и применять принципы объектно-ориентированного программирования.
Подумайте о сущностях, которые у вас есть, и примените отношения, имитирующие их реальное взаимодействие
"Программы должны быть написаны для того, чтобы люди могли их читать, и только для машин".
Если клиент в обеих моделях одинаковый, дублировать его не следует. Что касается производительности читать дальше select_related()
, only()
а также defer()
в Django документах.