Дублирование данных ИЛИ сохранение данных об элементах заказа в поле 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
}]
Вернуться на верх