我为那些需要能够在登录时收到管理员通知的用户编写Web应用程序。这些通知应显示在其仪表板上。
用户阅读完邮件后,可以将其解除。显然,新用户在创建之前不应显示消息。
我在设计架构方面遇到两个问题:
这是通知表:
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.Id
和User.Id
之间进行映射。如果存在一对,则用户驳回该通知。但是,我不确定这是否是最佳方法(not in
与left join
)?
对于#2,我看到的最简单的方法是向用户添加DateCreated
列,并在#1(where [DateCreated] >= [User].DateCreated
)上添加条件。
我不想要使用Cookie,因为这会给应用程序增加不必要的重量。
答案 0 :(得分:1)
我想说你自己的#1和#2解决方案似乎很好。
表示“已被解雇”通知的链接表是有意义的,否则您最终必须预先为每个用户创建一行,以表示通知而不是一条通知记录。
我也认为#2,通知的创建日期和用户也是一个明智的选择。如果您依赖于链接表的选项,那么使用“已解除”列的其他建议将无法仅在用户创建后显示通知,因为您最终会收到所有通知,而不仅仅是自用户以来的通知存在。
答案 1 :(得分:0)
对于#1:在Notification
表格中添加新列,类似dismissed
或readed
数据类型bit
即boolean
,默认值为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'列。这样,您就不需要复杂的查询来获取需要呈现给用户的通知。