前言
本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能。源代码不包含LayIM的源代码,因为官方并没开源属于收费资源,所以得遵从官方的规则,但包含Demo的数据库脚本和改造之后的find.html,源代码在最后一节。
文章目录:
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(一)之效果展示与关键技术简介
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(二)之后台数据库创建
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(三)之LayIM初始化数据
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(四)之ASP.NET SignalR核心功能介绍
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(五)之使用RabbitMQ缓存消息
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(六)之SignalR与MVC结合封装消息发送与接收
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(七)之LayIM与MVC数据交互实现单聊和群聊
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(八)之改造查找页面实现拉取好友创建群
一、后台数据库逻辑简介
Web聊天室的后台数据存储可以从四个方面考虑,当然也可以按照自己的思路,不限于本文所展示的思路,本文所述四个方面如下:
- 用户表:存储用户登录账户、签名、图像等信息
- 用户分组:存储各个账号的用户分组信息以及组成员
- 群组关系:存储所有的群组以及群组成员数据
- 聊天记录:聊天记录包括单聊即1对1聊天和群组聊天记录,可以将这两个聊天记录存储在同一张表,本来却将这两个记录分开,目的主要是考虑到聊天记录很多分表存储和从记录类型上分开以便于扩展
主要的设计思路是为了实现如下几个目标:
- 用户的基本信息,可扩展身份验证,其他信息如电话,住址等
- 好友分组,不同的用户有不同的好友分组,每个组内有不同的成员
- 群组关系,用来添加群组,创建群组,群组成员增加与移除
- 聊天记录,存储过去的所有聊天记录,方便历史记录查找
二、数据库表设计
按照上文的思路,本文将设计7个数据库表,分别是:
1.LIM.User:存储用户信息
CREATE TABLE [LIM].[User](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[Password] [nvarchar](100) NULL,
[UserName] [nvarchar](10) NOT NULL,
[UserSign] [nvarchar](100) NULL,
[UserAvatar] [nvarchar](1000) NOT NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]2.LIM.FriendGroup:存储用户的好友分组
CREATE TABLE [LIM].[FriendGroup](
[GroupId] [int] IDENTITY(1,1) NOT NULL,
[GroupName] [nvarchar](100) NOT NULL,
[GroupCreator] [int] NOT NULL,
[CreateTime] [datetime] NOT NULL,
CONSTRAINT [PK_FriendGroup] PRIMARY KEY CLUSTERED
(
[GroupId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]3.LIM.FriendGroupMember:存储好友分组成员
CREATE TABLE [LIM].[FriendGroupMember](
[GroupId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[UserId] [int] NOT NULL,
[AddTime] [datetime] NOT NULL,
CONSTRAINT [PK_LIM.FriendGroupMember] PRIMARY KEY NONCLUSTERED
(
[GroupId] ASC,
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]4.LIM.Room:存储群组信息
CREATE TABLE [LIM].[Room](
[RoomId] [int] IDENTITY(1,1) NOT NULL,
[RoomName] [nvarchar](100) NOT NULL,
[RoomAvatar] [nvarchar](1000) NULL,
[CreateTime] [datetime] NOT NULL,
[Creator] [int] NOT NULL,
CONSTRAINT [PK_Room] PRIMARY KEY CLUSTERED
(
[RoomId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
5.LIM.RoomMember:存储群组成员
CREATE TABLE [LIM].[RoomMember](
[RoomId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[UserId] [int] NOT NULL,
[AddTime] [datetime] NOT NULL,
CONSTRAINT [PK_LIM.RoomMember] PRIMARY KEY NONCLUSTERED
(
[RoomId] ASC,
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
6.LIM.RoomChat:存储群组聊天记录
CREATE TABLE [LIM].[RoomChat](
[ChatId] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[RoomId] [int] NOT NULL,
[ChatContent] [nvarchar](max) NOT NULL,
[ChatTime] [datetime] NOT NULL,
CONSTRAINT [PK_RoomChat] PRIMARY KEY CLUSTERED
(
[ChatId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
7.LIM.Message:存储单聊记录
CREATE TABLE [LIM].[Message](
[MessageId] [int] IDENTITY(1,1) NOT NULL,
[FUserId] [int] NOT NULL,
[TUserId] [int] NOT NULL,
[SendTime] [datetime] NOT NULL,
[MessageContent] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
三、数据库设计说明
本系列文章的demo使用的SQLServer数据库,其他数据库按照这个思路创建也可,按照自己的思路创建亦可,数据库的全脚本附在源代码中。