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,您會立即注意到這兩個用戶字段都是必需的。數據庫和開發人員在列存在時查找用戶也更容易。