0

我是数据库新手,在开始学习 mySQL 并在 Java 中使用驱动程序连接服务器端的数据库之前,我想先了解我的数据库设计。我在数据库中有两列,CRN NUMBER 和 DEVICE_TOKEN。CRN 号将是一个五位数的字符串,而 DEVICE_TOKEN 将是一个字符串设备令牌(用于推送通知的 iOS 设备令牌)。让我试着描述一下我正在尝试做的事情。我将让用户从 iOS 应用程序发送我的服务器数据,主要是他们用于推送通知的设备令牌和他们想要观看的 CRN(课程)。将会有许多设备令牌请求观看相同的 CRN 号码。我想知道将这些存储在数据库中的最有效方法。我将有一个线程查看数据库中的所有行,并为每个 CRN 轮询网站。如果我要查找的事件发生,我想通知与此 CRN 关联的每个设备令牌。最初,我希望一列是 CRN,另一列是 DEVICE_TOKENS。我知道这是不可能的,并且每一列应该只对应一个条目。有人可以帮我找出设计这个数据库的最佳方法,那将是最有效的吗?

CRN     DEVICE_TOKEN

12345   "string_of_correct_size"
12345   "another_device_token"

与其向网站发出多个请求以获取相同的 CRN,不如每次迭代轮询每个唯一 CRN 一次的网站,然后将更改通知所有设备令牌,这样会更有效。我应该如何存储这些信息?谢谢你的时间

4

2 回答 2

3

最常见的方法是使用设备令牌中的外键规范化课程。例如两个表:

Courses
id    CRN
1     12345

InterestedDevices
id    course    DEVICE_TOKEN
1     1        "string_of_correct_size"
2     1        "another_device_token"

然后,您可以使用如下 SQL 找到感兴趣的设备:

SELECT *
FROM Courses
JOIN InterestedDevices ON Courses.id = InterestedDevices.course
WHERE Courses.CRN = ?

这样您就可以避免一遍又一遍地复制课程信息。

于 2012-11-17T23:57:34.920 回答
3

在这种类型的问题中,您具有一对多关系(一个 CRN 与多个 Device_Tokens),您希望有一个单独的表来存储 CRN,其中为每个新 CRN 分配一个唯一 ID。然后应该为您的 DEVICE_TOKENS 创建一个单独的表,该表具有唯一 ID、CRN 和 DEVICE_TOKEN 的列。

使用此模式,您可以遍历 CRN 表的行,轮询每个 CRN,然后只需与 DEVICE_TOKEN 表进行简单的 JOIN 即可在发生更改时查找所有订阅的设备。

于 2012-11-18T00:03:20.713 回答