设计MySql表以同步通知

时间:2013-06-12 07:07:20

标签: mysql database-design notifications database-schema

我正在尝试设计一个通知架构,其中每个通知都有一个UID,需要传递给多个用户。每个用户设备都有最新通知的本地缓存。当用户设备联机时,它总是检查任何新通知并提取所有这些用户的通知。设备保留同步的最新通知的UID,并使用该UID从服务器获取更新的通知。

我想知道在MySQL表中实现这一点的最佳方法,使其可以超过500K用户。

我有一个通知详细信息表,其中通知UID是自动增量主键。我需要有关用户映射表的建议,可以是(忽略外键约束)

CREATE TABLE user_notifications_mapping ( 
    user_id INT UNSIGNED NOT NULL, 
    notification_id BIGINT UNSIGNED NOT NULL,
    UNIQUE KEY (user_id, notification_id)
) ENGINE=InnoDB;

但是如果在进行像

这样的查询时它是最好的表现,我会持怀疑态度
SELECT notification_id FROM user_notifications_mapping WHERE user_id = <user-id> AND notification_id > <last-notification-uid>

1 个答案:

答案 0 :(得分:1)

如果表格已正确编入索引,则此设计非常适合。假设在同步时只有“小”数量的通知将返回给一个给定的设备,中程服务器将能够每秒处理数百个这样的请求,即使该表很大(数百万行)。 / p>

现在这个表格将会增长非常。但我相信一个给定的通知只需要发送到一个给定的设备一次。一旦发送通知,我会考虑删除(或在另一个表中存档)该表的记录。从概念上讲,此表格类似于pending_notifications

[编辑]

鉴于新信息,该表可能会超出实际规模。你需要采取不同的方法。例如,可能有一种方法可以对通知进行分组(例如,它们属于给定类型,或者它们来自应用程序中的给定实体)。同样的概念可以应用于您的用户:也许您希望将某些通知发送给(例如)所有“客户”或“所有”管理员“。

基本思想是在较小基数的两个实体之间建立n-n关系。您不会对“某些用户收到某些通知”的情况进行建模,而是“某些用户组会收到某些类型的通知”。

示例:

  • 通知可以是“公告”,“通知”或“警告”(通知类型)
  • 用户可以是“管理员”或“客户”(用户组)

然后notifications_mapping表看起来像这样:

    +-----------------------+
    | notifications_mapping |
    +-----------------------+
    | notification_type     |
    | group_id              |
    +-----------------------+

相应的查询可能是:

SELECT notification_id
FROM notifications_mapping AS map
JOIN user ON user.group_id = map.group_id
JOIN notifications ON notifications.type = map.notification_type
WHERE user_id = <user-id> AND notification_id > <last-notification-uid>