用MySQL实现类似微信朋友圈的屏蔽功能

263 阅读3分钟

设计一个类似微信朋友圈的屏蔽功能的数据库需要考虑以下几个方面:

1. 用户信息表

首先需要设计一个用户信息表,用于存储每个用户的基本信息,例如用户ID、用户名、头像等。

2. 好友关系表

接下来需要设计一个好友关系表,用于存储每个用户的好友列表。该表至少包含两个字段:好友ID和用户ID,表示用户与其好友之间的关系。

3. 动态信息表

为了实现朋友圈功能,需要设计一个动态信息表,用于存储用户发布的动态信息。该表至少包含以下字段:动态ID、用户ID、发布时间、动态内容等。

4. 屏蔽关系表

接下来需要设计一个屏蔽关系表,用于存储用户屏蔽好友的关系。该表至少包含以下字段:屏蔽ID、用户ID、好友ID、屏蔽时间等。当用户屏蔽某个好友时,系统会在屏蔽关系表中添加一条记录。

在实际应用中,可能需要对上述表进行进一步设计和优化,例如添加索引、分表等操作,以提高数据库的性能和可扩展性。

数据库结构

下面是一个简单的例子,展示了各个表的结构:

1.用户信息表

字段名类型描述
user_idint用户ID
usernamevarchar(255)用户名
avatarvarchar(255)用户头像

2.好友关系表

字段名类型描述
friendship_idint好友关系ID
user_idint用户ID
friend_idint好友ID

3.动态信息表

字段名类型描述
post_idint动态ID
user_idint用户ID
post_timedatetime发布时间
post_textvarchar(255)动态文本内容
post_imagesvarchar(255)动态图片路径
post_videovarchar(255)动态视频路径

4.屏蔽关系表

字段名类型描述
block_idint屏蔽关系ID
user_idint用户ID
blocked_user_idint被屏蔽的好友ID
block_timedatetime屏蔽时间

上述表结构仅为示例,实际应用中可能需要根据具体需求进行进一步优化和修改。

创建数据表

下面是一个简单的例子,展示了如何使用SQL语句创建上述数据表:

1.用户信息表

CREATE TABLE user_info (
    user_id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(255) NOT NULL,
    avatar VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (user_id)
);

2.好友关系表

CREATE TABLE friendship (
    friendship_id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    friend_id INT NOT NULL,
    PRIMARY KEY (friendship_id),
    FOREIGN KEY (user_id) REFERENCES user_info(user_id),
    FOREIGN KEY (friend_id) REFERENCES user_info(user_id)
);

3.动态信息表

CREATE TABLE post (
    post_id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    post_time DATETIME NOT NULL,
    post_text VARCHAR(255) DEFAULT NULL,
    post_images VARCHAR(255) DEFAULT NULL,
    post_video VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (post_id),
    FOREIGN KEY (user_id) REFERENCES user_info(user_id)
);

4.屏蔽关系表

CREATE TABLE block (
    block_id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    blocked_user_id INT NOT NULL,
    block_time DATETIME NOT NULL,
    PRIMARY KEY (block_id),
    FOREIGN KEY (user_id) REFERENCES user_info(user_id),
    FOREIGN KEY (blocked_user_id) REFERENCES user_info(user_id)
);

发布动态的过程

以下是一个示例的SQL语句,用于向动态信息表中插入一条新的动态信息。假设需要实现的功能是:当用户A发动态时,可以选择屏蔽给定的好友B,即B无法看到这条动态。

INSERT INTO post (user_id, post_time, post_text, post_images, post_video)
VALUES (A, NOW(), '这是一条动态', '图片路径', '视频路径');

-- 获取新插入的动态ID
SET @post_id = LAST_INSERT_ID();

-- 如果B被屏蔽,则在屏蔽关系表中插入一条记录
IF EXISTS (
    SELECT * FROM block WHERE user_id = A AND blocked_user_id = B
) THEN
    INSERT INTO block (user_id, blocked_user_id, block_time)
    VALUES (A, B, NOW());
END IF;

查看动态的过程

以下是一个示例的SQL语句,用于查询符合条件的动态信息。假设需要实现的功能是:当用户A浏览动态信息时,只能看到没有屏蔽自己的好友所发出的动态,且结果按照动态的发布时间倒序排列。

SELECT *
FROM post
WHERE user_id IN (
    SELECT friend_id
    FROM friendship
    WHERE user_id = A
) AND user_id NOT IN (
    SELECT blocked_user_id
    FROM block
    WHERE user_id = A
) ORDER BY post_time DESC;

上述SQL语句中,A为当前用户的ID。查询中使用了子查询,通过查询好友关系表和屏蔽关系表,过滤出了符合条件的动态信息。