Django App中的销售点架构设计问题

时间:2018-10-06 09:15:27

标签: mysql django database postgresql database-design

在这些模型中(下),由于我不是数据库设计专家,因此在创建此应用程序时遇到了设计问题,因此我想就此问题采取一些专家意见。让我解释一下这个问题。

如您所见,有一个SaleItem模型,其中包含product_id作为外键。现在的问题是..

  1. 如果用户删除SaleItem表中存在的产品,则将引发完整性违规问题或某种方式,如果我们允许删除产品,则产品关系将中断,我们将无法运行查询与产品有关。

  2. 如果用户将产品名称从A更新为B或更改了价格,则为
    将影响已售物品。

我尽力解释了这种情况,但是如果有什么遗漏,请在评论中问我。

谢谢

class Product(models.Model):

    class Meta:
        db_table = 'product'

    name = models.CharField(max_length=255, blank=False, null=False)
    franchise = models.ForeignKey(Franchise, default=None, on_delete=models.DO_NOTHING)
    category = models.CharField(max_length=255, default=None, blank=False, null=False)
    supplier = models.CharField(max_length=255, default=None, blank=False, null=False)
    company = models.CharField(max_length=255, default=None, blank=False, null=False)
    purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
    sale_price = models.DecimalField(max_digits=10, decimal_places=2, blank=False, null=False, default=None)
    discount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    units_in_stock = models.IntegerField(blank=False, null=False)
    manufacture_date = models.DateField(blank=False, null=False)
    expire_date = models.DateField()
    product_code = models.CharField(max_length=20,unique=True, blank=True, null=True)


class Sale(models.Model):
    class Meta:
        db_table = 'sales'

    franchise = models.ForeignKey(Franchise, on_delete=models.DO_NOTHING)
    amount = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    paid = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    discount = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    balance = models.DecimalField(max_digits=20, decimal_places=2, default=0)


class SaleItem(models.Model):
    class Meta:
        db_table = 'sale_items'

    sale = models.ForeignKey(Sale, on_delete=models.CASCADE)
    product_id = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(blank=False, null=False, default=None)
    total_price = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)

0 个答案:

没有答案