SQL-每个用户的已读/未读通知的表结构
我需要在web应用程序上创建一个通知模块,并且我想知道哪个用户已经阅读了通知,这样我就不必显示指示尚未阅读通知的红色标记 我想到了两种解决办法 第一个有点幼稚,但我发现它更容易实现和维护: 解决方案#1: 因此,在本例中,当用户打开未读通知时,我将在SQL-每个用户的已读/未读通知的表结构,sql,sql-server,Sql,Sql Server,我需要在web应用程序上创建一个通知模块,并且我想知道哪个用户已经阅读了通知,这样我就不必显示指示尚未阅读通知的红色标记 我想到了两种解决办法 第一个有点幼稚,但我发现它更容易实现和维护: 解决方案#1: 因此,在本例中,当用户打开未读通知时,我将在ReadByUsers列中附加用户ID,因此它看起来像10,12,15,20 然后,当我需要检查用户是否已阅读通知时,我将简单地查询该列以查看是否包含用户id 第二种解决方案看起来更像是“最佳实践”方法,但我想它会变得更复杂、更沉重 解决方案#2:
ReadByUsers
列中附加用户ID,因此它看起来像10,12,15,20
然后,当我需要检查用户是否已阅读通知时,我将简单地查询该列以查看是否包含用户id
第二种解决方案看起来更像是“最佳实践”方法,但我想它会变得更复杂、更沉重
解决方案#2:
在本例中,我将看到通知的用户存储在另一个表中,该表在主表的通知Id上具有关系(一对多)。然后我可以检查通知\u Users
表,检查用户是否看到了通知
还请注意:
- 我不需要知道用户看到通知的时间
- 预计该应用程序在短期内不会超过10000个用户
- 通知将在几个月后从数据库中删除。因此,一次最多10次通知
。将列表存储在字符串中是设计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
)