哪个数据库设计更适合django follow/unfollow?

哪个数据库设计更适合django follow/unfollow?,django,django-models,Django,Django Models,在django项目中,我一直在为类似twitter的社交网站寻找良好的数据库设计,我发现了两种可能性: 下面这个 class Following(models.Model): follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name='following') following = models.ForeignKey(User

在django项目中,我一直在为类似twitter的社交网站寻找良好的数据库设计,我发现了两种可能性: 下面这个

class Following(models.Model):
    follower = models.ForeignKey(User, on_delete=models.CASCADE,
                                 related_name='following')
    following = models.ForeignKey(User, on_delete=models.CASCADE,
                                  related_name='followers')
另一个呢

class User(AbstractUser):
    follows = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='followed_by')
    pass

这些是一样的吗?这有什么区别吗?我应该选择哪一个?我是个新手,所以我不知道哪一个是最好的选择。我发现第一个模型更容易理解。

我建议两种模型的代码都可以正常工作

如果您想使用新字段创建自定义用户模型,请使用以下代码格式

  • AbstractUser:使用用户模型中的现有字段
  • AbstractBaseUser:如果您想从中创建自己的用户模型 刮伤
您希望分离与应用程序相关的更改,然后使用以下代码

class Following(models.Model):
    follower = models.ForeignKey(User, on_delete=models.CASCADE,
                                 related_name='following')
    following = models.ForeignKey(User, on_delete=models.CASCADE,
                                  related_name='followers')

如果我将其添加到我的用户模型中

following = models.ManyToManyField('self', related_name="followers")
然后运行(假设
auth
是您的用户模型所在的应用程序,并用生成的迁移数替换
000X

这就是我得到的:

CREATE TABLE `auth_user_following` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `from_user_id` integer NOT NULL, `to_user_id` integer NOT NULL);
ALTER TABLE `auth_user_following` ADD CONSTRAINT `auth_user__from_user_id_b9318b74_fk_auth_` 
    FOREIGN KEY (`from_user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_user_following` ADD CONSTRAINT `auth_user__to_user_id_b51bc961_fk_auth_` 
    FOREIGN KEY (`to_user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_user_following` ADD CONSTRAINT `auth_user_foll_from_user_id_to_au_88cd5a29_uniq` 
    UNIQUE (`from_user_id`, `to_user_id`);
因此,它创建了一个具有自动生成的id和两个外键列的表,就像它使用仅显式关系模型一样,即在数据库端,没有结构上的差异

对于代码可读性,我更愿意将关系保留在模型中,而不是在不同的类中定义它。但是,如果要向关系中添加其他数据(例如,在之后添加开始日期),则需要明确的关系模型。然后,您可能仍然希望在您的用户模型中提到这种多对多关系,并指出:

但是,有时您可能需要将数据与 两个模型之间的关系。 [...] Django允许您指定将 用于管理多对多关系。然后你可以把 中间模型上的额外字段。中间模型是 使用through参数与ManyToManyField关联 指向将充当中介的模型


第一种方法或显式直通模型的另一个原因是,它可能有助于对关系进行一些查询,例如“查找相互关注的用户”。

据我所知,它们在某种程度上是等价的:在数据库级别,两者都将创建一个中间表来处理多对多关系,并为它们保存相似的数据;现在,在应用程序方面,我倾向于使用第二个而不是第一个,因为您不需要使用中介模型。
python manage.py makemigrations auth
python manage.py sqlmigrate auth 000X
CREATE TABLE `auth_user_following` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `from_user_id` integer NOT NULL, `to_user_id` integer NOT NULL);
ALTER TABLE `auth_user_following` ADD CONSTRAINT `auth_user__from_user_id_b9318b74_fk_auth_` 
    FOREIGN KEY (`from_user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_user_following` ADD CONSTRAINT `auth_user__to_user_id_b51bc961_fk_auth_` 
    FOREIGN KEY (`to_user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_user_following` ADD CONSTRAINT `auth_user_foll_from_user_id_to_au_88cd5a29_uniq` 
    UNIQUE (`from_user_id`, `to_user_id`);