代码之家  ›  专栏  ›  技术社区  ›  user2896120

下表的跟随者是多对多关系吗?

  •  1
  • user2896120  · 技术社区  · 6 年前

    我有两个模型。一个模型是用户表,它包含如下字段 id, username, email 我还有一张表,用来表示一个跟随者和跟随者的关系。显示了以下模型:

    class Following(models.Model):
        target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True)
        follower = models.ForeignKey('User', related_name='targets', on_delete=models.CASCADE, null=True)
    
        def __str__(self):
            return '{} is followed by {}'.format(self.target, self.follower)
    

    我假设用户和跟随者之间的关系是一对多关系(一个用户可以有许多跟随者,也可以跟随许多跟随者)。这是对的吗?或者应该是多对多的关系。如果是,为什么?我已经看到这个表模式的许多实例是多对多和一对多。

    用户类:

    class User(AbstractBaseUser):
        username    = models.CharField(max_length=15, unique=True)
        email       = models.EmailField(max_length=100, unique=True)
        date_joined = models.DateTimeField(auto_now_add=True,
                                           null=True) 
        active      = models.BooleanField(default=True)
        staff       = models.BooleanField(default=False)
        admin       = models.BooleanField(default=False)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Damir Sudarevic    6 年前

    使用谓词 [PX] 和限制 [CX.Y] .


    [P1] 用户(userid)存在。

    [未经证实] 用户由userid标识。

    user {UserID}  -- p1
     KEY {UserID}  -- c1.1
    

    [P2] 跟随者(followerid)跟随作者(authord)。

    [C2.1] 跟随者是用户。

    [C2.2] 作者是用户。

    [C2.3] 对于每个跟随者,该跟随者可以跟随多个作者。

    [C2.4] 对于每个作者,该作者后面可能有多个跟随者。

    [C2.] 对于作者和跟随者的每个组合,该作者和跟随者的组合最多可能出现一次。

    [C2.6] 作者可能不会跟随自己。

    following {AuthorID, FollowerID} -- p2
          KEY {AuthorID, FollowerID} -- c2.5, c2.3, c2.4
    
    FOREIGN KEY {FollowerID} REFERENCES user {UserID} -- c2.1
    FOREIGN KEY {AuthorID}   REFERENCES user {UserID} -- c2.2
    
          CHECK AuthorID != FollowerID                -- c2.6
    

    底线,多对多。通过关注用自然语言表达的概念/逻辑设计(谓词和约束),您始终可以对此进行调整以反映您的特定需求。