2012-11-17 26 views
0

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

CRN  DEVICE_TOKEN 

12345 "string_of_correct_size" 
12345 "another_device_token" 

而是我进行多次请求到网站同CRN,那将是更有效,我一次轮询每个独特CRN网站每次迭代,然后通知该改变所有的设备令牌。我应该如何存储这些信息?感谢您的时间

回答

3

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

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

+0

好吧,这听起来像EdC建议的。你有什么教程可以帮助我加快如何编写代码在MySQL中执行这些操作? – kamran619

+0

我还没有亲自过任何在线教程,但已经看过本教程推荐用于数据库设计和SQL的一般介绍[使用UML和SQL进行数据库设计](http://www.tomjewett.com/dbdesign/dbdesign.php ?页= intro.html)。我建议您熟悉一般SQL和_normalization_(帮助您了解如何将数据正确分离到表中以确保一致性等),然后通过MySQL文档学习其SQL的实现。 – Jenga

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 = ? 

这样你可以避免一遍又一遍重复的路线信息。

+0

所以你建议我应该为每个CRN分开一个表?此表中的每一行都是唯一的DEVICE_TOKEN?对不起,评论会让这更容易理解,因为我还没有学过MYSQL语法。 – kamran619

+0

绝对不是,我建议你有一张桌子拿着独特的CRN(我以为你说的是​​课程)。然后有第二张桌子拿着所有的订阅设备。 – EdC

+0

好的,我明白你在说什么了。课程表中的ID将用于从InterestedDevices表中查找设备令牌。那是对的吗? – kamran619