Дублирование данных ИЛИ сохранение данных об элементах заказа в поле JSONField
У меня есть отношение один ко многим с Order к OrderItem. OrderItems сохраняет детали таблицы Item. Пункт может быть удален пользователем, но я не могу удалить информацию о пункте из таблицы OrderItem (потому что она будет использоваться для генерации отчетов), поэтому я не стал перемещать ключ Item в OrderItem и сохранять всю информацию из таблицы item в OrderItem.
Теперь вы видите, что данные дублируются из Item в таблицу OrderItem. Мой вопрос заключается в том, или я хочу попросить совета, что я использую postgresql и у нас есть роскошь JSONField. Так вот, хорошая ли это идея сохранить всю информацию из таблицы Item в JSONField и удалить все поля?
Позже я должен генерировать отчеты из OrderItem, например, сколько заказов было размещено или рассчитать прибыль, используя таблицу OrderItem.
class Item(models.Model):
class Meta:
db_table = 'items'
SKU = models.PositiveIntegerField()
name = models.CharField(max_length=255, blank=False, null=False)
supplier = models.ForeignKey(Supplier,on_delete=models.CASCADE, blank=False, null=False)
purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
trade_price = models.DecimalField(max_digits=10, decimal_places=2,blank=False, null=False , default = 0.00)
retail_price = models.DecimalField(max_digits=10, decimal_places=2)
class Order(models.Model):
class Meta:
db_table = 'orders'
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True, related_name='orders')
serial_no = models.CharField(max_length=30, null=False, unique=True)
recieved_amount = models.DecimalField(max_digits=15, decimal_places=3, default=0)
class OrderItem(models.Model):
class Meta:
db_table = 'order_items'
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')
name = models.CharField(max_length=255)
quantity = models.IntegerField(default=1)
purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
trade_price = models.DecimalField(max_digits=10, decimal_places=2)
retail_price = models.DecimalField(max_digits=10, decimal_places=2)
если мы собираемся использовать JSONField для OrderItem, схема будет выглядеть следующим образом
NOTE Теперь отношение Order к OrderItem также изменено с 1:M на 1:1, еще одно преимущество с моей точки зрения.
class OrderItem(models.Model):
class Meta:
db_table = 'order_items'
order = models.OneToOneField(Order, on_delete=models.CASCADE, related_name='items')
item = models.JSONField(default=dict)
Формат JSON будет иметь вид
[{
"items":
[{
"item_name": "Some product",
"quantity" : 3,
"purchase_price": 34,
"trade_price" : 54,
"retail_price" : 64
},
{
"item_name": "Some product",
"quantity" : 3,
"purchase_price": 34,
"trade_price" : 54,
"retail_price" : 64
},
{
"item_name": "Some product",
"quantity" : 3,
"purchase_price": 34,
"trade_price" : 54,
"retail_price" : 64
},
{
"item_name": "Some product",
"quantity" : 3,
"purchase_price": 34,
"trade_price" : 54,
"retail_price" : 64
}],
"sales_tax": [
{
"tax": "GST",
"percentage": 10
},
{
"tax": "FED",
"percentage": 4
},
],
"discount": 3
}]