SQL-每个用户的已读/未读通知的表结构

SQL-每个用户的已读/未读通知的表结构,sql,sql-server,Sql,Sql Server,我需要在web应用程序上创建一个通知模块,并且我想知道哪个用户已经阅读了通知,这样我就不必显示指示尚未阅读通知的红色标记 我想到了两种解决办法 第一个有点幼稚,但我发现它更容易实现和维护: 解决方案#1: 因此,在本例中,当用户打开未读通知时,我将在ReadByUsers列中附加用户ID,因此它看起来像10,12,15,20 然后,当我需要检查用户是否已阅读通知时,我将简单地查询该列以查看是否包含用户id 第二种解决方案看起来更像是“最佳实践”方法,但我想它会变得更复杂、更沉重 解决方案#2:

我需要在web应用程序上创建一个通知模块,并且我想知道哪个用户已经阅读了通知,这样我就不必显示指示尚未阅读通知的红色标记

我想到了两种解决办法

第一个有点幼稚,但我发现它更容易实现和维护:

解决方案#1:

因此,在本例中,当用户打开未读通知时,我将在
ReadByUsers
列中附加用户ID,因此它看起来像10,12,15,20

然后,当我需要检查用户是否已阅读通知时,我将简单地查询该列以查看是否包含用户id

第二种解决方案看起来更像是“最佳实践”方法,但我想它会变得更复杂、更沉重

解决方案#2:

在本例中,我将看到通知的用户存储在另一个表中,该表在主表的通知Id上具有关系(一对多)。然后我可以检查
通知\u Users
表,检查用户是否看到了通知

还请注意:

  • 我不需要知道用户看到通知的时间

  • 预计该应用程序在短期内不会超过10000个用户

  • 通知将在几个月后从数据库中删除。因此,一次最多10次通知

你对更好的实施有什么建议吗

谢谢

解决方案#2将是首选解决方案

存储ID列表不是标准化的解决方案。在我看来,将其分为两张表的投资回报比所感知的复杂性更重要

下面是一些很好的信息,并且诚实地在网上传播


。将列表存储在字符串中是设计SQL数据库的错误方法。这应该能回答你的问题。沉重是一个视角的问题。选项2似乎更简单,在db级别,只有一个insert,然后是否存在。另外,如果在这两个字段上有一个主聚集键,那么在sql引擎上就不会那么繁重了。选项1需要一个更不具体的read查询,然后需要解析readbyusers列。鉴于读取是更常见的操作,这是使用情况考虑第一。二进制?不。它应该是与通知PK相同的数据类型(最好是相同的名称),以及相应的外键(或多个键,UserID不是某个用户表的FK吗?)。不要养成定义没有长度的数据类型的习惯(对于那些支持长度的数据类型)
binary
binary(1)
完全相同,并且DateInserted应该是具有所需精度的datetime或datetime2。时间数据类型不支持255个小数位数,并且没有日期组件。您可以创建名为Notification_User_Events的第三个表,并且在向其添加行时,还可以更新Notification_Users表中的位列,以指示消息已被读取
CREATE TABLE [Notifications1] 
(
    Id integer NOT NULL,
    Title varchar(255) NOT NULL,
    Description varchar(255) NOT NULL,
    DateInserted datetime NOT NULL,
    ReadByUsers varchar(MAX) NOT NULL
)
CREATE TABLE [Notifications] 
(
    Id integer NOT NULL,
    Title varchar(255) NOT NULL,
    Description varchar(255) NOT NULL,
    DateInserted datetime  NOT NULL,

    CONSTRAINT [PK_NOTIFICATIONS] 
        PRIMARY KEY CLUSTERED
)

CREATE TABLE [Notification_Users] 
(
    NotificationId integer NOT NULL,
    UserId integer NOT NULL
)