功能主要包括两部分
A部分 可以实现用户间Message的收发;
B部分 可以让系统向所有用户发信息(这个操作有可能是经常进行的).
功能实现
A部分 功能数据库设计比较简单
B部分 .我想主要有两种方法去实现:
一是一个用户增加一条记录,这样实现很方便,如果在用户不是很多的情况下可以考虑,但是如果用户很多的话,缺点就显示出来了,太浪费数据库资源,不太现实.
还有一种方法就是把收Message的用户Sender_User_ID 和 Receiver_User_ID设置成0,表示是系统的信息,可是这样的问题是怎么区分一个用户有没有 读这个消息.可以解决的方法是增加一张表MessageIsRead,如果用户已经读则添加一条记录,select数据查一下MessageIsRead,如果已经有记录了就表示已经读了~
具体实现过程
表结构
1
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MessageIsRead]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
2
drop table [dbo].[MessageIsRead]
3
GO
4![](/Images/OutliningIndicators/None.gif)
5
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Message]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
6
drop table [dbo].[Message]
7
GO
8![](/Images/OutliningIndicators/None.gif)
9
CREATE TABLE [dbo].[MessageIsRead] (
10
[User_ID] [bigint] NOT NULL ,
11
[Message_ID] [bigint] NOT NULL
12
) ON [PRIMARY]
13
GO
14![](/Images/OutliningIndicators/None.gif)
15
CREATE TABLE [dbo].[Message] (
16
[Message_ID] [bigint] IDENTITY (1, 1) NOT NULL ,
17
[Message_Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
18
[Message_Content] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NOT NULL ,
19
[Receiver_User_Id] [bigint] NOT NULL ,
20
[Sender_User_ID] [bigint] NOT NULL ,
21
[Send_Time] [datetime] NOT NULL ,
22
[Is_Read] [bigint] NOT NULL
23
) ON [PRIMARY]
24
GO
25![](/Images/OutliningIndicators/None.gif)
26![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
存储过程
1
--检查同名的SP是不是已经存在,若存在则删除.
2
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[usp_Message_Select]') AND type='P')
3
DROP PROCEDURE [dbo].[usp_Message_Select]
4
GO
5![](/Images/OutliningIndicators/None.gif)
6
--创建SP
7
CREATE PROCEDURE [dbo].[usp_Message_Select]
8
(
9
@User_ID bigint
10
)
11
AS
12
SELECT * FROM
13
(
14![](/Images/OutliningIndicators/None.gif)
15
--以下为普通的用户间对发的Message
16
SELECT
17
Message_ID,
18
Message_Title,
19
Message_Content,
20
Is_Read
21
FROM
22
Message
23
WHERE
24
Receiver_User_ID = @User_ID
25
26
UNION
27![](/Images/OutliningIndicators/None.gif)
28
--以下为系统Message
29
SELECT
30
Message.Message_ID,
31
Message_Title,
32
Message_Content,
33
CASE ISNULL(MessageIsRead.[User_ID],0) WHEN 0 THEN 0 ELSE 1 END AS Is_Read --如果用户没有阅读,MessageIsRead.[User_ID]为 null
34
FROM
35
Message
36
Left JOIN
37
MessageIsRead
38
ON
39
MessageIsRead.[User_ID] = @User_ID
40
AND
41
MessageIsRead.[Message_ID] = Message.Message_ID
42
WHERE
43
Sender_User_ID = 0
44
AND
45
Receiver_User_ID = 0 --Sender_User_ID = 0 and Receiver_User_ID = 0 表示是系统信息
46![](/Images/OutliningIndicators/None.gif)
47
) a
48
GO
49![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
其他说明:
这样的设计已经破坏了数据的完整性,因为Sender_User_ID和Receiver_User_ID 为0时,User_ID = 0的数据在用户表中并不存在,如果要解决这个问题可以把系统向用户发的数据单独放在另外一张新的表格里.
在这里还是没有从根本上解决数据的完整性问题,比如当用户向系统管理员发Message和管理员向用户发Message时Sender_User_ID,Receiver_User_ID怎么填?因为系统管理员在用户表里是不存在的,所以没有真正的User_ID.如果您知道这个问题请您在回复里告诉我,谢谢.