实时 API 调用的数据库架构建议
Database schema advice for real time API calls
我有一些当地高中体育联盟的项目需要一些实时更新的统计数据。参加活动(美式足球、篮球、排球、高尔夫、摔跤等)的人将使用我的 CMS 系统更新统计数据。
我似乎无法理解如何存储这些统计数据,所以当 REST API 调用发生时,最新的事件将被发回(例如:收集当时发生的所有篮球比赛在服务器上并保存它们)。
进入服务器的数据采用 JSON 格式,我希望能够这样存储它,每项运动都是主要的关键,然后是逐场比赛的统计数据。在我看来,使用 RDBMS 或其他数据库类型是没有意义的,因为实时添加统计数据意味着会有大量数据几乎没有差异的行,然后如果我要分解每一个,收集最近的游戏会很痛苦人的 POST
并将其保存为自己的行。
另一方面,我可以将所有内容都存储在一个文件中,收集传入的统计信息并更新文件。但是,如果发生大量写入,对 API 调用的响应可能会变慢。
有什么建议吗?我的想法哪里错了?
将数据存储为 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'
我有一些当地高中体育联盟的项目需要一些实时更新的统计数据。参加活动(美式足球、篮球、排球、高尔夫、摔跤等)的人将使用我的 CMS 系统更新统计数据。
我似乎无法理解如何存储这些统计数据,所以当 REST API 调用发生时,最新的事件将被发回(例如:收集当时发生的所有篮球比赛在服务器上并保存它们)。
进入服务器的数据采用 JSON 格式,我希望能够这样存储它,每项运动都是主要的关键,然后是逐场比赛的统计数据。在我看来,使用 RDBMS 或其他数据库类型是没有意义的,因为实时添加统计数据意味着会有大量数据几乎没有差异的行,然后如果我要分解每一个,收集最近的游戏会很痛苦人的 POST
并将其保存为自己的行。
另一方面,我可以将所有内容都存储在一个文件中,收集传入的统计信息并更新文件。但是,如果发生大量写入,对 API 调用的响应可能会变慢。
有什么建议吗?我的想法哪里错了?
将数据存储为 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'