如何在我们的数据库中存储设备令牌以进行推送通知?

Jam*_*111 4 postgresql android database-design push-notification ios

我们正在为我们的应用程序设置推送通知,并发现如果我们将用户设备令牌存储在用户表中,我们会遇到一些问题。

  1. 用户将只能在一台设备上接收推送通知(他们可以登录多个)

我们的用户表:

| id (user pk) | ... other fields | device_token (for push notifs) |
Run Code Online (Sandbox Code Playgroud)

其他 2 个解决方案是:

  1. 用户表中存储一个 JSON 数组
  2. 创建第二个名为user_devicetokens 的表并链接user_iddevice_token + 任何其他可能有用的设置。

我想知道其他人如何做到这一点以及这些解决方案是否可以以任何方式改进?

isi*_*ick 7

不清楚您使用的是什么数据库,但如果它是关系型的(如 MySQL),那么 JSON 数组将违反良好数据库设计的第一种正常形式。而且在我看来,这是一个非首发。

考虑到您说您只会向一个设备发送推送通知,在用户表上存储单个设备 ID 是一个不错的解决方案。但在我看来,这种方法有两个缺点(不是说它错了,而是要考虑的事情):

  • 你确定你的担忧不会改变吗?如果您想推送通知以驱动用户更新他们的应用怎么办?您肯定希望将它们发送到安装了它的每台设备。这不适用于仅存储一个设备 ID 的一列。
  • 或者,如果您决定还想记录他们使用的应用程序版本怎么办?这将需要在您的用户表中至少再添加一列app_version。扩展这个进一步的(date_last_notifieddevice_type?等),你突然增加了很多额外的列来可能不涉及用户实体清楚你的用户表。这将违反关系数据库设计的第二范式,因为您的新用户列将不再描述用户实体。

用于引用用户的设备 ID 的额外表确实增加了一些复杂性,但这正是关系数据库的设计目的。

我的建议是现在给它一个单独的表,但是如果你打算用用户表上的一个列来构建它也很好 - 在重构的时候做好准备(并且无所畏惧)。