2012-03-05 72 views
1

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

一旦用户阅读了消息,他们可以解雇它。显然,新用户在创建之前不应显示消息。

我有两个问题,设计模式:

  1. 如何识别用户已“开除”的消息?
  2. 新用户在创建后只能看到消息吗?

这里的表通知:

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 in vs left join)?

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

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

回答

1

我会说你自己的解决方案#1和#2在这里看起来很好。

表示“解雇”通知的链接表是有意义的,否则最终不得不为每个用户在前面创建一行,以表示通知而不是一个通知记录。

我认为#2,有一个通知的创建日期和用户将是一个明智的选择。如果您依赖于链接表的选项,则使用'已解雇'列的其他建议不会使您仅在创​​建用户后显示通知,因为您最终将收到所有通知,而不仅仅是因为用户存在。

+0

谢谢 - 我将坚持我原来的计划。 – TheCloudlessSky 2012-03-06 13:17:12

+0

我认为这是最明智的选择,我最近做了类似警报系统的工作。我打算为每个用户插入一行并删除它们,但由于我们有2-3,000个用户,并且警报一次只能与10-20个用户相关,因此添加数千行永远不会触及的行似乎效率低下。 – dougajmcdonald 2012-03-06 14:47:43

0
  • #1:添加一个新列Notification表像dismissed或数据类型bitbooleanreaded用默认值0或假,然后在你的应用程序,一旦用户打开该邮件,将dismissed的值更新为1,我看到其他系统添加了一个名为Mark的按钮,以确保用户阅读它。

  • #2:您可以使用此字段dismissed,只显示那些已经因为他们还没有被opended和用户readed尚未驳回,用户的消息。

所以通知表看起来是这样的:

[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

0

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