【问题标题】:Database schema advice for real time API calls实时 API 调用的数据库架构建议
【发布时间】:2015-10-21 22:10:42
【问题描述】:

我有一个针对一些当地高中体育联盟的项目,需要一些实时更新的统计数据。参加活动(美式足球、篮球、排球、高尔夫、摔跤等)的人会使用我的 CMS 系统来更新统计数据。

我似乎不知道如何存储这些统计数据,因此当 REST API 调用发生时,最新的事件将被发回(例如:在服务器上收集当时发生的所有篮球比赛并保存它们)。

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

另一方面,我可以将所有内容存储在一个文件中,在它们进入时收集统计数据并更新文件。但如果发生大量写入,对 API 调用的响应可能会变慢。

有什么建议吗?我的哪个想法是错误的?

【问题讨论】:

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


    【解决方案1】:

    将数据存储为 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'
    

    【讨论】:

    • 感谢您的回答。如果对于一个游戏,比如说 2.5 小时的游戏,可能有超过 100 次更新,数据库不会增长得非常快吗?我是否只需要定期清理它,因为我认为统计数据行或多或少会很快达到数百万?
    • 大多数关系数据库管理系统能够处理大量行(数亿和数十亿)没有问题。例如,在我的公司,我们使用 MS SQL Server 每分钟存储数以万计的“统计数据”。在我们决定放弃关系数据库之前,我们的数据库有好几 TB(主要是一张表)。这一切都是为了正确设计您的架构,以便您可以有效地查询数据。如果你这样做,那么有多少原始数据将无关紧要。另外,听起来你是从小做起,你肯定不想
    • 编写自己的基于文件的数据库系统
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多