【问题标题】:Database design for Group Notification System群组通知系统的数据库设计
【发布时间】:2011-04-19 13:34:48
【问题描述】:

我正在尝试创建一个群组通知系统。如果我在一个群组中,那么任何在群组墙上发表评论的人都会向每个群组成员发送通知。这是我的数据库设计:我有两个表:NotificationNotificationRead

NotificationRead
+userId (String)
+lastRead (int) - default is 0

Notification
...
+time(int)
...

每个用户在NotificationRead 中都有一个条目,它会跟踪我最后一次阅读通知的时间。 逻辑是:对于特定用户,如果Notification.time > NotificationRead.lastRead,则该通知被视为未读。假设在group A中,有4条通知我没有读过,它们的time7, 8, 9, 10,那么当我点击group A时,我设置了我的NotificationRead.lastRead = 10(最大时间),所以我不会再读它们了。新通知的时间将从 11 点开始。现在,这是我的问题。假设我有 3 个组,A、B 和 C

A(4):最大的时间是10
B (1):最大时间为14
C(1):最大时间为12

如果我点击 A,我的 NotificationRead.lastRead = 10,A 旁边的 4 清除,B 和 C 旁边的 1 保持不变。现在如果我点击 B,我的lastRead 现在是 14,所以它不仅清除了 B 旁边的 1,而且还清除了 C 旁边的 1,因为 14 > 12。谁能帮我想办法解决这个问题。我愿意完全重新设计一切

【问题讨论】:

    标签: mysql database database-design notifications jpql


    【解决方案1】:

    您不能只在 NotificationRead 表中添加一个 groupID 列,以便知道每个 User\Group 组合的 lastRead 值吗?

    【讨论】:

      【解决方案2】:

      如果您想知道每个用户每个组的最后通知时间,您必须存储该信息。因此,每个用户在 NotificationRead 中必须有多个记录,该记录必须与用户表成为单独的表。此表将包含三列,即 user_id、group_id 和该用户/组的 lastread 值。

      【讨论】:

      • 我遇到了这种方法的问题。首先,我搜索所有未读通知,然后创建一个hashMap,将未读通知列表映射到组列表中。恕我直言,这比从我的组列表循环并将请求发送到数据库要快。 (请阅读下文)
      • (请先阅读以上内容)现在我搜索所有未读通知的方式是Notification.time > NotificationRead.lastRead,这很有意义,因为lastRead 与唯一的userId 相关联。但是现在lastReaduserId and groupId关联,意味着有多个lastRead per userId, cant do Notification.time > NotificationRead.lastRead`
      • 假设您使用基于 SQL 的数据库,自然的方式(至少对我,数据库程序员而言)是使用 SQL 查询获取未读通知。要获取组 A 中 user_id 100 的未读通知,SQL 将是 SELECT * FROM notifications N INNER JOIN NotificatoinRead NR ON N.user_id = NR.user_id AND N.group_id = NR.group_id WHERE N.user_id = 100 AND N。 group_id = A AND N.time > NR.lastRead。要跨组获取所有未读通知,请从查询中删除“AND N.group_id = A”。
      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 2017-07-17
      • 2012-02-12
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2010-11-10
      相关资源
      最近更新 更多