0

我想创建一个费用跟踪应用程序,每个用户都可以输入费用并将其分类到他自己的类别中。下面是我用的模型定义:在Django中没有重复的外键引用设计

from django.db import models 
from django.contrib.auth.models import User 

class Category(models.Model): 
    user = models.ForeignKey(User, related_name="my_categories") 
    name = models.CharField(max_length=50) 

class Expense(models.Model): 
    date = models.DateField() 
    amount = models.IntegerField() 
    description = models.TextField() 
    category = models.ForeignKey(Category) 
    user = models.ForeignKey(User) 

每个类别必须与用户相关联,这样我们就可以显示每个用户自己的类别,而进入费用选择。由于类似的原因,每个费用记录应该与用户相关联。但是在费用的定义中,我们有两个对用户模型的引用,一个直接通过'user'字段,另一个通过具有用户引用的'category'字段。

我相信像这样的多重引用是一件坏事。有没有更好的方法来建模?我知道我们可以从类别引用中找到用户,但似乎是一个迂回的做法。

+0

你为什么认为这是一件坏事? – Marcin

+0

@Marcin,因为理论上这些引用中的2个可以指向2个不同的用户实例,除非数据得到了适当的验证 – Guruprasad

+1

是的,但是有不同的正常形式的原因不只是第六种正常形式。只要你的应用逻辑合理,这不太可能是个问题。 – Marcin

回答

1

尽管你的数据库不是100%标准化,在你的情况下,我不相信第二个参考是多余的。 “费用”和“类别”都是属于用户的明确定义的实体。如果您稍后想要更改您的外键以允许空类别或ManyToManyField,您会立即注意到这两个用户字段都是必需的。数据库和开发人员在列存在时查找用户也更容易。