【问题标题】:Database schema for simple stats project简单统计项目的数据库模式
【发布时间】:2010-12-24 09:49:44
【问题描述】:

背景:

我有一个 cvs 文件的文件层次结构,用于多个位置,这些位置按它们涵盖的日期命名……具体而言是按月。文件夹中的每个 cvs 文件都以位置命名。

例如', 文件夹名称:2010 年 2 月

包含: 位置1.csv location2.csv

每个 CSV 文件都包含这样的记录:

2010-06-28, 20:30:00 , 0
2010-06-29, 08:30:00 , 0
2010-06-29, 09:30:00 , 0
2010-06-29, 10:30:00 , 0
2010-06-29, 11:30:00 , 0

记录列的含义(列名):

Date, time, # of sessions

我有一个 perl 脚本可以从这个混乱中提取数据,最初我打算将它存储为 json 文件,但我认为数据库可能更适合长期...比较每年的趋势...有趣像这样的东西。

第 2 部分 - 我的问题/问题:

所以我现在有一个 REST 服务,它使用测试数据库生成 json。我的问题是[我不擅长数据库设计],如何最好地为此设计数据库后端?

我认为以下表格就足够了并保持简单:

Location: (PK)location_code, name 
session: (PK)id, (FK)location_code, month, hour, num_sessions

除了给定月份或月份中的星期几外,我还需要能够在一周的几天内平均每个小时的会话数(加上最小值和最大值)。我一直在使用 perl 哈希来执行此操作,并且正在尝试确定如何最好地使用数据库来实现它。

您认为应该使用存储过程吗?

关于数据库,根据这里收集的信息,它将是 postgresql 或 sqlite。 如果 postgresql 没有令人信服的理由,我会坚持使用 sqlite。

我应该如何以及在哪里将数据与运行小时数进行比较。我正在存储时间 yaml 文件中的操作。我目前将数据中的小时“匹配”到来自 yaml 的哈希来执行此操作。数据库会打开更简单的方法吗?我想我会像现在一样做这个比较,然后插入数据。可以通过以下方式召回:

SELECT hour, num_sessions FROM session WHERE location_code=LOC1

由于只有几个小时的营业时间,我无需担心。 我是否应该像现在一样计算所有结果,然后存储为统计表 不同的“报告”?这,而不是按需处理?这看起来如何?

不管怎样……我在闲逛。

感谢阅读!

布布诺夫

【问题讨论】:

    标签: database-design


    【解决方案1】:

    根据我对 SQLite 的阅读,它提供了您进行所需分析所需的功能(sum、avg 等),看起来您将在自己的 api 级别上执行此操作,而不是允许最终用户通过界面自己完成。因此,对于您拥有的简单设计 + 小型数据集,我会考虑将您的所有数据放入 SQLite。我也会把它放在 SQLite 可以原生理解的格式中,这样你就可以使用它的 SQL 函数,而无需先转换任何东西,也不需要创建要在 SQL 中使用的特殊函数来进行转换。

    除此之外,您的设计对我来说看起来不错,除了月份和小时字段。我会将它们保留为完整的日期和时间字段,或者如果有适当的 SQLite 数据类型,则可能将它们组合成一个 date_time 字段,并将完整的日期/时间数据放入其中(以防您以后需要它) .然后使用 SQLite 时间函数从完整的日期/时间字段中提取适当的月份和小时。为方便起见,如果 SQLite 支持它,您可以在会话表中为月份和小时创建 计算字段,这样您就可以立即从查询中返回要查找的数据,而不是在您想要一个月或一小时的每个查询中显式调用时间提取函数。

    此外,不要忘记将索引放在您在查询中设置条件的字段上。您可能不会注意到小型数据集的差异,但随着您的数据库变大,它们可能会产生巨大的差异。

    【讨论】:

    • 由于数据库的无知/天真,我可能会产生误解。我决定将小时数和月数分开,因为需要跨小时平均会话而不考虑月份。我还需要在一个月内对它们进行平均,还有特定的日子——或者至少允许这种可能性。通过像这样分隔时间日期,我认为这比稍后解析然后处理要容易。我需要做更多的研究来“得到”你所描述的——“计算领域”。在数据库方面,我是一个严肃的菜鸟。
    • sqlite.org/lang_datefunc.html 。我将不得不考虑如何使用它,而不是事先将其解析出来并单独存储。我的预制统计表想法怎么样?
    • 计算字段允许您从已有的完整日期和时间数据中分离出月份和小时数,同时允许您在以后需要时保留这些数据。如果您确定您不需要/不需要完整的日期和全职时间,那么您当然可以坚持现有的设计。我个人的看法是,我通常将原始数据移植回来,而不是仅仅计划每周/每月使用脚本将其带入并让计算字段自动为我拆分数据。
    • 计算字段是您定义公式的字段,当查询从表中请求该字段时,数据库将运行该公式。例如,您可以将您的全时数据放入其自己的名为 time 的字段中,并创建一个名为 hour 的计算字段,该字段定义为公式 strftime('%H', [time])。现在,“SELECT hour FROM session”将自动为您运行该公式,并为您返回的每一行提供小时。制作“月”计算字段也是如此。
    • 我不会考虑使用预制统计表,直到性能慢到无法接受地计算结果。大多数普通的报告工具在处理原始数据方面做得非常出色。此外,如果您制作了一个预制统计表,您很可能难以将这些数据连接到标准报告工具中,因为他们通常希望根据原始数据进行计算。如果您有 Microsoft Access 或 Excel,请深入了解它们的数据透视表功能,因为它们可以通过 ODBC 连接进行很多您所描述的分析类型,我相信 SQLite 有驱动程序。
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2014-03-06
    • 1970-01-01
    • 2021-01-05
    • 2011-01-02
    相关资源
    最近更新 更多