用户通知系统的模式

时间:2012-03-05 14:09:46

标签: .net sql sql-server asp.net-mvc-3 schema

我为那些需要能够在登录时收到管理员通知的用户编写Web应用程序。这些通知应显示在其仪表板上。

用户阅读完邮件后,可以将其解除。显然,新用户在创建之前不应显示消息。

我在设计架构方面遇到两个问题:

  1. 如何确定用户已经解雇了#34;一条消息?
  2. 新用户如何仅在创建消息后才能看到消息?
  3. 这是通知表:

    CREATE TABLE [dbo].[Notification] 
    (
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [Message] [varchar](max) NOT NULL,
      [DateCreated] [datetime] NOT NULL,
      [CreatedById] [int] NOT NULL
    )
    

    对于#1,我在考虑创建一个表格DismissedNotification_User),该表格会在Notification.IdUser.Id之间进行映射。如果存在一对,则用户驳回该通知。但是,我不确定这是否是最佳方法(not inleft join)?

    对于#2,我看到的最简单的方法是向用户添加DateCreated列,并在#1(where [DateCreated] >= [User].DateCreated)上添加条件。

    我不想要使用Cookie,因为这会给应用程序增加不必要的重量。

3 个答案:

答案 0 :(得分:1)

我想说你自己的#1和#2解决方案似乎很好。

表示“已被解雇”通知的链接表是有意义的,否则您最终必须预先为每个用户创建一行,以表示通知而不是一条通知记录。

我也认为#2,通知的创建日期和用户也是一个明智的选择。如果您依赖于链接表的选项,那么使用“已解除”列的其他建议将无法仅在用户创建后显示通知,因为您最终会收到所有通知,而不仅仅是自用户以来的通知存在。

答案 1 :(得分:0)

  • 对于#1:Notification表格中添加新列,类似dismissedreaded数据类型bitboolean,默认值为0或false,然后在您的应用程序中,一旦用户打开邮件,将dismissed的值更新为1,我看到其他系统添加了一个名为标记为已加入,以确保用户阅读它。

  • 对于#2:您可以使用此字段dismissed仅显示尚未向用户解除的消息,因为这些消息尚未打开,由用户引导。

因此通知表看起来像:

[Notification] 
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Message] [varchar](max) NOT NULL,
    [DateCreated] [datetime] NOT NULL,
    [CreatedById] [int] NOT NULL,
    [Readed] bit Default(0)
)

您需要一个额外的表来存储每个用户的通知,例如

dbo.UserNotifications
(
    UserId, NotificationId
)

在您的应用程序中,当用户登录系统时,使用readed = 0检查通知。

答案 2 :(得分:0)

您可以通过创建包含用户和消息的表来加入这两项任务。管理员发送消息时,您为每个现有(活动?)用户创建条目。如果您不需要历史记录,则可以在用户解除通知后删除该消息;否则你应该添加'Dismissed'列。这样,您就不需要复杂的查询来获取需要呈现给用户的通知。