【发布时间】:2018-09-02 23:16:15
【问题描述】:
在创建多对多关系时,我们使用中间表。假设我使用以下实体 video、category、tag 和 VideoCategory、VideoTag 来创建关系。
我假设很多标签/类别可以有很多视频,反之亦然。
我使用 through 关键字来做这件事,因为我希望将来能够使用额外的字段,如果我愿意的话。
class Category(models.Model):
category = models.CharField(max_length=50)
def __str__(self):
return self.category
class Tag(models.Model):
tag = models.CharField(max_length=50)
def __str__(self):
return self.tag
class Video(models.Model):
title = models.CharField(max_length=255)
categories = models.ManyToManyField(Category, through='VideoCategory')
tags = models.ManyToManyField(Tag, through='VideoTag')
def __str__(self):
return self.title
class VideoCategory(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
video = models.ForeignKey(Video, on_delete=models.CASCADE)
class VideoTag(models.Model):
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
video = models.ForeignKey(Video, on_delete=models.CASCADE)
但我想知道是否可以创建一个taxonomy 实体并从一个地方处理与类别和标签的关系。
class Category(models.Model):
category = models.CharField(max_length=50)
def __str__(self):
return self.category
class Tag(models.Model):
tag = models.CharField(max_length=50)
def __str__(self):
return self.tag
class Video(models.Model):
title = models.CharField(max_length=255)
categories = models.ManyToManyField(Category, through='Taxonomy')
tags = models.ManyToManyField(Tag, through='Taxonomy')
def __str__(self):
return self.title
class Taxonomy(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE, null=True)
video = models.ForeignKey(Video, on_delete=models.CASCADE)
现在taxonomy 实体将持有与视频相关的category 和tag,反之亦然。
我已经包含了“null=True”,以便能够创建与没有标签的类别和有标签但没有类别的关系。
如果我不使用它。我收到一个错误:
# sqlite3.IntegrityError: NOT NULL constraint failed: MyApp_taxonomy.category_id
这也意味着,如果每个具体关系实例(行)上的 category 或 tag 字段之一为空,则将单个 taxonomy 实体用于两个关系可能有许多 NULL 字段。
问题:
什么会更好?保持中间表分开 (VideoCategory & VideoTag) 或将这些中间表合并为一个? (分类)
由于我缺乏数据库方面的经验,我不能说我是否遗漏了一些重要的东西。如果只使用一张中间表会在不久的将来出现问题或类似的事情......如果它就好了。
【问题讨论】:
-
我猜我的第二个例子产生了模棱两可的相关字段。这样 django 就无法知道它应该使用哪个字段?这就是为什么我应该使用 through_fields 属性来指定它们。
标签: django database foreign-keys entity-relationship