哪个数据库设计更适合django follow/unfollow?
在django项目中,我一直在为类似twitter的社交网站寻找良好的数据库设计,我发现了两种可能性: 下面这个哪个数据库设计更适合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
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`);