• 类似bbs的message功能的数据库设计


    功能描述:
            功能主要包括两部分
            A部分 可以实现用户间Message的收发;
            B部分 可以让系统向所有用户发信息(这个操作有可能是经常进行的).

    功能实现
            A部分 功能数据库设计比较简单

            B部分 .我想主要有两种方法去实现:
                一是一个用户增加一条记录,这样实现很方便,如果在用户不是很多的情况下可以考虑,但是如果用户很多的话,缺点就显示出来了,太浪费数据库资源,不太现实.
                还有一种方法就是把收Message的用户Sender_User_ID 和 Receiver_User_ID设置成0,表示是系统的信息,可是这样的问题是怎么区分一个用户有没有 读这个消息.可以解决的方法是增加一张表MessageIsRead,如果用户已经读则添加一条记录,select数据查一下MessageIsRead,如果已经有记录了就表示已经读了~ 
                具体实现过程
    表结构
     1if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MessageIsRead]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
     2drop table [dbo].[MessageIsRead]
     3GO
     4
     5if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Message]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
     6drop table [dbo].[Message]
     7GO
     8
     9CREATE TABLE [dbo].[MessageIsRead] (
    10    [User_ID] [bigint] NOT NULL ,
    11    [Message_ID] [bigint] NOT NULL 
    12ON [PRIMARY]
    13GO
    14
    15CREATE TABLE [dbo].[Message] (
    16    [Message_ID] [bigint] IDENTITY (11NOT 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 
    23ON [PRIMARY]
    24GO
    25
    26

    存储过程
     1--检查同名的SP是不是已经存在,若存在则删除.
     2IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[usp_Message_Select]'AND type='P')
     3DROP PROCEDURE [dbo].[usp_Message_Select]
     4GO
     5
     6--创建SP
     7CREATE PROCEDURE [dbo].[usp_Message_Select]
     8(
     9    @User_ID bigint
    10)
    11AS
    12SELECT * FROM
    13(
    14
    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
    28--以下为系统Message
    29    SELECT
    30        Message.Message_ID,
    31        Message_Title,
    32        Message_Content,
    33        CASE ISNULL(MessageIsRead.[User_ID],0WHEN 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
    47    ) a
    48GO
    49

    其他说明:
          这样的设计已经破坏了数据的完整性,因为Sender_User_ID和Receiver_User_ID 为0时,User_ID = 0的数据在用户表中并不存在,如果要解决这个问题可以把系统向用户发的数据单独放在另外一张新的表格里.
          在这里还是没有从根本上解决数据的完整性问题,比如当用户向系统管理员发Message和管理员向用户发Message时Sender_User_ID,Receiver_User_ID怎么填?因为系统管理员在用户表里是不存在的,所以没有真正的User_ID.如果您知道这个问题请您在回复里告诉我,谢谢. 
  • 相关阅读:
    uTenux-OS-Task再探
    uTenux——LED驱动讲解
    uTenux——HelloWord
    uTenux——重新整理底层驱动库
    template的超级bug
    [LeetCode] Integer to Roman
    [LeetCode] Roman to Integer
    [LeetCode]Flatten Binary Tree to Linked List
    [LeetCode] LRU Cache [Forward]
    [LeetCode] Reorder List
  • 原文地址:https://www.cnblogs.com/zitiger/p/194561.html
Copyright © 2020-2023  润新知