存储关注用户的最佳方式
Best way to store followed users
我知道标题不是那么描述,但真的很难找到通用的东西来描述我的情况。如果有人要编辑,请随意...
所以,我有一个带有 users
table 的 postgres 数据库。我想存储一个用户跟随的用户,但我真的不知道该怎么做。我想像 SELECT followed_users FROM users WHERE username='username'
那样做,这将 return 我的每个用户名,或 ID,或每个关注用户的任何内容。但是我没有看到任何 clean 方法来做到这一点。
也许举个例子更能说明问题:user1
在 user2
和 user3
之后。
如何存储 user1
关注的人?
编辑:我不知道用户会关注多少用户。
感谢您的帮助。
扩展我上面的评论,因为它变得冗长:
创建一个新的 table,名称类似于 user_follows
,列类似于
user_id1 | user_id2
或
follower_id | follows_id
那么您可以查询:
SELECT t1.username as follower_username, t3.username as following_usernae
FROM users t1
INNER JOIN user_follows t2 ON t1.user_id = t2.follower_id
INNER JOIN users t3 ON t2.following_id = t3.user_id
WHERE t1.user_id = <your user>
最后,将您的 table 想象成 "Objects"。然后,当您遇到类似 "How do I add users that are following other users" 的问题时,您可以确定此关系是新对象还是现有对象的属性。由于一个用户可能会关注多个其他用户,而不是这种关系对于 "Users" 来说不是一个好的属性,因此它获得了自己的 table user_follows
。
由于 user_follows
只是两个用户之间可能存在的一种关系,因此将该对象的范围增加到 relationships
并将关系类型存储为table:
的属性
user_id1 | user_id2 | relationship_type
其中 relationships.relationship_type
可能具有 follows, student of, sister
等值...
所以新的查询应该是这样的:
SELECT t1.username as follower_username, t3.username as following_username
FROM users t1
INNER JOIN relationships t2 ON t1.user_id = t2.user_id1
INNER JOIN users t3 ON t2.user_id2 = t3.user_id
WHERE t1.user_id = <your user> AND t2.relationship_type = 'Follows';
我要添加另一个 table,为了争论起见,我们称之为 following
,这样可以节省成对的用户和他们正在关注的用户:
CREATE TABLE following (
user_id INT NOT NULL REFERENCES users(id),
following_id INT NOT NULL REFERENCES users(id),
PRIMARY KEY (user_id, following_id)
)
然后您可以通过加入 users
table(两次)来查询特定用户关注的所有用户。例如,获取我(用户名 "mureinik")关注的所有用户的姓名:
SELECT fu.username
FROM following f
JOIN users u ON f.user_id = u.id
JOIN users fu ON f.user_id = fu.id
WHERE u.username = 'mureinik'
我知道标题不是那么描述,但真的很难找到通用的东西来描述我的情况。如果有人要编辑,请随意...
所以,我有一个带有 users
table 的 postgres 数据库。我想存储一个用户跟随的用户,但我真的不知道该怎么做。我想像 SELECT followed_users FROM users WHERE username='username'
那样做,这将 return 我的每个用户名,或 ID,或每个关注用户的任何内容。但是我没有看到任何 clean 方法来做到这一点。
也许举个例子更能说明问题:user1
在 user2
和 user3
之后。
如何存储 user1
关注的人?
编辑:我不知道用户会关注多少用户。
感谢您的帮助。
扩展我上面的评论,因为它变得冗长:
创建一个新的 table,名称类似于 user_follows
,列类似于
user_id1 | user_id2
或
follower_id | follows_id
那么您可以查询:
SELECT t1.username as follower_username, t3.username as following_usernae
FROM users t1
INNER JOIN user_follows t2 ON t1.user_id = t2.follower_id
INNER JOIN users t3 ON t2.following_id = t3.user_id
WHERE t1.user_id = <your user>
最后,将您的 table 想象成 "Objects"。然后,当您遇到类似 "How do I add users that are following other users" 的问题时,您可以确定此关系是新对象还是现有对象的属性。由于一个用户可能会关注多个其他用户,而不是这种关系对于 "Users" 来说不是一个好的属性,因此它获得了自己的 table user_follows
。
由于 user_follows
只是两个用户之间可能存在的一种关系,因此将该对象的范围增加到 relationships
并将关系类型存储为table:
user_id1 | user_id2 | relationship_type
其中 relationships.relationship_type
可能具有 follows, student of, sister
等值...
所以新的查询应该是这样的:
SELECT t1.username as follower_username, t3.username as following_username
FROM users t1
INNER JOIN relationships t2 ON t1.user_id = t2.user_id1
INNER JOIN users t3 ON t2.user_id2 = t3.user_id
WHERE t1.user_id = <your user> AND t2.relationship_type = 'Follows';
我要添加另一个 table,为了争论起见,我们称之为 following
,这样可以节省成对的用户和他们正在关注的用户:
CREATE TABLE following (
user_id INT NOT NULL REFERENCES users(id),
following_id INT NOT NULL REFERENCES users(id),
PRIMARY KEY (user_id, following_id)
)
然后您可以通过加入 users
table(两次)来查询特定用户关注的所有用户。例如,获取我(用户名 "mureinik")关注的所有用户的姓名:
SELECT fu.username
FROM following f
JOIN users u ON f.user_id = u.id
JOIN users fu ON f.user_id = fu.id
WHERE u.username = 'mureinik'