我想设计一个表来存储我的网络项目中的友谊关系
至少应满足以下4个条件:
谁发送添加好友请求,例如(如果 A TO B 那么此列将是 A)
谁收到添加好友请求,例如(如果 A TO B 那么此列将是 B)
当前状态 eg(0 表示拒绝,1 表示接受或 2 表示未处理
我们的朋友关系是双边的
如果你们有这方面的经验,欢迎提出任何建议
我目前的设计(我现在认为不好)是这样的, 这些是列
frienshipId
fromUserId
toUserId
status
requestTime
Run Code Online (Sandbox Code Playgroud)
我会创建一张很像你的表。我正在使用 SQL Server 数据类型和语法,您可能需要根据您的平台进行调整。
CREATE TABLE FriendStatus
(FriendStatusId BIGINT PRIMARY KEY IDENTITY(1,1),
FromUserId BIGINT,
ToUserId BIGINT,
StatusId TINYINT,
SentTime DATETIME2,
ResponseTime DATETIME2);
Run Code Online (Sandbox Code Playgroud)
随着表增长到数千万和数亿,表的索引将变得至关重要。
在 PostgreSQL 上:
CREATE TABLE users (
users_id serial PRIMARY KEY,
name text UNIQUE NOT NULL
);
CREATE TABLE friends (
friends_id serial PRIMARY KEY,
timestamp TIMESTAMPTZ default now(),
user_a integer NOT NULL REFERENCES users,
user_b integer NOT NULL REFERENCES users,
status integer NOT NULL default 2
)
Run Code Online (Sandbox Code Playgroud)
对于列出友谊,一个视图:
CREATE VIEW friendships AS
SELECT DISTINCT user_a, user_b FROM friends WHERE status = 1
UNION
SELECT DISTINCT user_b, user_a FROM friends WHERE status = 1;
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它:
INSERT INTO users ( name ) VALUES ( 'foo' );
INSERT INTO users ( name ) VALUES ( 'bar' );
INSERT INTO users ( name ) VALUES ( 'baz' );
SELECT * FROM users;
users_id | name
----------+------
1 | foo
2 | bar
3 | baz
INSERT INTO FRIENDS ( user_a, user_b, status ) VALUES ( 1, 2, 1 );
INSERT INTO FRIENDS ( user_a, user_b, status ) VALUES ( 2, 1, 1 );
INSERT INTO FRIENDS ( user_a, user_b, status ) VALUES ( 1, 3, 1 );
SELECT * FROM friendships ORDER BY user_a, user_b;
user_a | user_b
--------+--------
1 | 2
1 | 3
2 | 1
3 | 1
SELECT a.name, b.name
FROM friendships
JOIN users a ON a.users_id = user_a
JOIN users b ON b.users_id = user_b
ORDER BY a.name, b.name;
name | name
------+------
bar | foo
baz | foo
foo | bar
foo | baz
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18504 次 |
| 最近记录: |