2015-09-29 93 views
1

讓我們假設我有書籍和評論,我也有評論可以與書或評論相關,但不是同時給他們兩個,我該如何設計我的數據庫?我想我能做到這樣,但後來的意見可能與這兩本書和評論...:如何設計mysql數據庫,其中一個表應該只與另外兩個表中的一個相關?

class Book(models.Model): 
    title = models.CharField(max_length=100) 

class Review(models.Model): 
    review = models.TextField() 

class Comment(models.Model): 
    book = models.ForeignKey(null=True) 
    review = models.ForeignKey(null=True) 
+0

回答在http://stackoverflow.com/questions/32574929/designing-relationships-around-an-inheritance-structure/32597847#32597847等地。你只需要在數據庫中實現一個超級/子結構。 – TommCatt

回答

0

好,GenericForeignKey是做它的官方途徑,但GenericForeignKey很爛。

正常F​​oreignKey的只能用「點」另外一個模式,這意味着 ,如果TaggedItem模型中使用一個ForeignKey那就要選擇 一個且只有一個模型來存儲標籤。該CONTENTTYPES應用 提供了一種特殊字段類型(GenericForeignKey)的工作解決 這一點,並讓關係可與任何型號:

好耶,不是按照這樣的描述,但它吮吸。所以你的方法不是一個壞主意。你有兩種不同的強制約束方式。首先是在數據庫級別,並且100%是萬無一失的,那就是創建一個ON INSERT TRIGGER,它將檢查兩個字段中的任何一個是否爲空。

第二種方法是覆蓋模型中的保存方法。

def save(self, *args, **kwargs): 
    if self.book and self.review: 
     raise ValueError('Hey you cant do that') 
    else: 
     Super(Comment, self).save(*args, **kwargs) 
相關問題