用于实时API调用的数据库模式建议

时间:2015-07-30 13:53:18

标签: php database file api content-management-system

我有一个当地高中体育联盟的项目,希望通过统计数据进行实时更新。活动中的人(美式足球,篮球,排球,高尔夫,摔跤等)将使用我的CMS系统来更新统计数据。

我无法理解如何存储这些统计信息,因此当REST API调用发生时,最新事件将被发回(例如:收集当时在服务器上发生的所有篮球游戏,拯救他们。)

进入服务器的数据是JSON格式,我希望能够存储它,每项运动都是主键,然后是逐个游戏的统计数据。在我看来,使用RDBMS或其他数据库类型是没有意义的,因为实时添加统计数据意味着数据几乎没有差异的行,然后收集最近的游戏将是一个痛苦,如果我打破每个人POST并将其保存为自己的行。

另一方面,我可以将所有内容存储在文件中,收集统计信息并更新文件。但是如果发生许多写操作,对API调用的响应可能会变慢。

有什么建议吗?我的哪些想法在这里错了?

1 个答案:

答案 0 :(得分:2)

将数据存储为JSON通常会限制您查询数据的能力。我建议反对。 JSON是在服务器上接受的完全可接受的格式,但是您应该立即将其反序列化为对象并以满足您的用例的方式存储它。在我看来,您的用例需要一个关系数据库。例如。这样的模式可以让您在发现所有正在发生的游戏时获得良好的性能:

Sport:
    pk int sportId
       varchar description

Game:
    pk int gameId
    fk int sportId
       datetime start
       datetime end 

Player:
    pk int playerId
       varchar name

StatType:
    pk int statTypeId
       varchar description

Stat:
    pk bigint statId
    fk int gameId
    fk int playerId
    fk int statTypeId
       datetime time
       real value

获取当前游戏:

SELECT * FROM Game WHERE currentTime > start AND end IS NULL

获取玩家的所有时间统计信息

SELECT max(st.description), sum(value) FROM Stat s LEFT JOIN StatDescription st ON s.statTypeId = st.statTypeId LEFT JOIN Player p ON s.playerId = p.playerId GROUP BY st.statTypeId WHERE p.name = 'John Smith'