Лучше хранить fk напрямую или получать из другой связанной таблицы?
Например, у меня есть две модели. Я запутался, что лучше: хранить department_id
непосредственно в модели Sale или использовать product.department
, когда это необходимо.
Вариантом использования отдела в модели продаж может быть фильтрация продаж по отделам, отчеты о продажах отдела или т.д.
class Product():
name = models.CharField()
department = models.ForeignKey(Department)
class ProductSale()
product = models.ForeignKey(Product)
department = models.ForeignKey(Department)
# other fields
Or just
class ProductSale()
product = models.ForeignKey(Product)
# other fields
Вы можете использовать метод queryset.query в оболочке, чтобы увидеть соответствующий SQL-запрос.
print(ProductSale.objects.filter(department_id=kwargs.get("department_id")).query)
print(ProductSale.objects.filter(product__department_id=kwargs.get("department_id")).query)
Вы заметили, что второй запрос содержит дополнительную операцию Inner Join по сравнению с первым. Поэтому второй запрос будет менее эффективным.
Однако имеет ли это значение на практике - другой вопрос.
Бизнес-логика важнее эффективности запросов. Модель ProdcutSale должна иметь отдел, потому что вы хотите отслеживать продажи для каждого отдела, но зачем вам нужен отдел в модели Product? Продукт может продаваться многими отделами.
Оба утверждения верны, они зависят от бизнес-логики.
Случай 1
class Product():
name = models.CharField()
department = models.ForeignKey(Department)
Он показывает, к какому отделу относится данный продукт.
Product | Department |
---|---|
Book | Education |
computer | Electronic |
Случай 2
Для вашего случая. Если вы хотите хранить информацию о проданных товарах по отделам.
class Product():
name = models.CharField()
# other fields
class ProductSale()
product = models.ForeignKey(Product)
department = models.ForeignKey(Department)
# other fields
Это указывает на то, что один и тот же товар может продаваться и разными отделами.
Я думаю, что второй запрос менее эффективен, но также я думаю, что нет никакой хранить department_id в модели ProductSale, так как мы можем получить id отдела через продукт.
Если отдел фиксирован по продуктам, как в примере 1, тогда да, нет необходимости хранить department_id в ProductSale. Но если это не так, то хранение отдела в ProductSale является правильным способом.