Лучше хранить 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 является правильным способом.

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