如何设计一个关系数据库表来存储友谊关系?

Hi福*_*福气鱼 9 database-design

我想设计一个表来存储我的网络项目中的友谊关系

至少应满足以下4个条件:

谁发送添加好友请求,例如(如果 A TO B 那么此列将是 A)

谁收到添加好友请求,例如(如果 A TO B 那么此列将是 B)

当前状态 eg(0 表示拒绝,1 表示接受或 2 表示未处理

我们的朋友关系是双边的

如果你们有这方面的经验,欢迎提出任何建议

我目前的设计(我现在认为不好)是这样的, 这些是列

frienshipId  
fromUserId  
toUserId  
status  
requestTime
Run Code Online (Sandbox Code Playgroud)

mrd*_*nny 9

我会创建一张很像你的表。我正在使用 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)

随着表增长到数千万和数亿,表的索引将变得至关重要。


jkj*_*jkj 8

在 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)