优化捕获出勤数据模式的最佳方法是什么

2023-12-11

我们有一个体育训练营,该市的各个团队定期参加该训练营。我们每天有一次持续 2 小时(上午 9 点至 11 点)的会议,不同团队的时间段可能有所不同。我们希望了解每天参加训练营的人员情况。

我们采用以下模型来捕获出席率。 (id、user_id、日期、当前)。假设用户每天参加训练营(比如一个月 30 天),您将在数据库中看到这么多记录。

假设我们只对找出用户参加训练营的天数感兴趣,是否有更好的方法来标记特定用户的存在或缺席(也许只是一个月的单行并将所有单独的天标记为类似于 (P,P,P,A, ...,A,P)。P = 存在,A = 不存在


您在问题标题中使用“优化”一词而没有解释你想要优化什么.

如果您谈论的是查询性能,那么您就没有问题。您可以拥有的记录数量取决于您每天参加的会议数量(因为只有一个团队可以参加任何给定的会议)。如果您每天运行十个会话,那么每月就有三百条记录。如果您每天运行一百个会话,则每月会产生三千条记录。这些数据量并不大。因此,您通过扭曲数据库设计来避免不存在的性能问题,从而做出了错误的决定。

您在评论中提到了电子表格。这并不是一个糟糕的设计。顶行是会议,下方是团队,单元格显示团队是否出席会议。它们映射到三个数据库表:SESSIONS、TEAMS 和交集表 TEAM_SESSIONS。当团队参加会议时,您只需要在 TEAM_SESSIONS 中记录。

作为概念验证,我在 Oracle 中创建了三个表。

SQL> desc teams
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 NAME                                               VARCHAR2(20 CHAR)

SQL> desc sessions
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 SSN_DAY                                            DATE
 SSN_START                                          NUMBER(4,2)
 SSN_END                                            NUMBER(4,2)

SQL> desc team_sessions
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TEAM_ID                                   NOT NULL NUMBER
 SESSION_ID                                NOT NULL NUMBER

SQL>

Oracle 11g 中引入的 PIVOT 函数使得构建矩阵变得轻而易举(不同风格的 DBMS 将有不同的方法来实现这一点)。正如您所看到的,三支球队今天已经预订了课程,没有人愿意在午餐时间训练,而贝克联队则非常热衷(或需要训练)!

SQL> select * from (
  2      select t.name as team_name
  3             , trim(to_char(s.ssn_start))||'-'||trim(to_char(s.ssn_end)) as ssn
  4             , case when ts.team_id is not null then 1 else 0 end as present
  5      from   sessions s
  6             cross join teams t
  7             left outer join team_sessions ts
  8                  on (ts.team_id = t.id
  9                      and ts.session_id = s.id )
 10      where s.ssn_day = trunc(sysdate)
 11      )
 12  pivot
 13      ( sum (present)
 14        for ssn in ( '9-11', '11-13', '13-15', '15-17', '17-19')
 15      )
 16  order by team_name
 17  /

TEAM_NAME                '9-11'    '11-13'    '13-15'    '15-17'    '17-19'
-------------------- ---------- ---------- ---------- ---------- ----------
Balham Blazers                0          1          0          0          0
Bec United                    1          0          0          0          1
Dinamo Tooting                0          0          0          0          0
Melchester Rovers             0          0          0          1          0

SQL>

无论如何,这个数据模型的优点是它是灵活的。我们可以统计团队参加的频率、参加的时间、参加一周中的哪一天、哪些会议总是被预订、哪些会议很少被预订等等。此外,管理数据也很容易。特别是,三桌解决方案相对于两桌解决方案的优势在于,更容易防止重复预订以及非标准或重叠的时段。

你看,正常化不仅仅是我们用来迷惑无辜者的某种月球语言,它提供了真正的实际好处。在某些情况下,降低到至少 BCNF 并不是最好的主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化捕获出勤数据模式的最佳方法是什么 的相关文章

  • 为什么使用散列来为大量文件创建路径名?

    我注意到在许多情况下 应用程序或数据库使用 has 来存储文件 blob 集合来确定路径和文件名 我相信预期的结果是路径永远不会太深 或者文件夹太满 文件夹中的文件 或文件夹 太多 导致访问速度变慢 编辑 示例通常是数字图书馆或存储库 尽管
  • 两种表结构的区别

    我对这两种结构很困惑 这两个表各有什么优缺点 哪一个更好 为什么 TABLE1 反模式 在常见情况下 第二个表是反模式在数据库设计的背景下 而且 更重要的是 它有特定的名称 实体 属性 值 EAV 在某些情况下 使用这种设计是合理的 但这种
  • Postgres 动态创建序列

    我正在编写一个应用程序 其中有多个用户 用户可以在应用程序内上传报告 目前 我有一个 报告 表 其中包含所有提交的报告 其中有一个 id 字段 该字段是表上的序列主键 我指定的要求是 用户需要能够指定其报告开始计数的前缀和数字 例如 用户应
  • 使用 MongoDB 有效确定层次结构中记录的所有者

    我正在努力实现以下目标 选择我拥有的所有记录 其中所有权是我创建的对象或我管理的用户创建的对象 其中用户管理可以在管理用户的用户层次结构中 所有权显然很简单 可以通过与所有者相对应的简单 ID 来处理 用户管理的层次结构让我有点难以执行 而
  • 连接表的最佳 SQL 索引

    考虑到性能改进 我想知道哪些索引对连接表 特别是在 Rails 3 has and belongs to many 上下文中使用 是否有帮助以及哪些索引有帮助 模型和表格设置 我的模型是Foo and Bar根据 Rails 约定 我有一个
  • JSONB 会让 PostgreSQL 数组变得无用吗?

    假设您想在对象 例如帖子 上存储 标签 在 9 4 版本中 您有 3 个主要选择 标签作为文本 标签为 jsonb 标签作为文本 并且您将 JSON 字符串存储为文本 在许多情况下 第三个是不可能的 因为它不允许对 标签 值进行条件查询 在
  • 谁能用适当的例子向我解释 1NF、2NF、3NF、BCNF 规则?

    这是一个常见的面试问题 我遇到过一次面试 面试官给了我一张桌子 让我告诉他这张桌子是哪种范式 如果它在 NF中 那么将其归一化到下一个NF 我总是对这些正常形式的数据库感到困惑 谁能向我解释这些范式 并举出每个 NF 如何建模到表中的正确示
  • 标签系统:Toxi 解决方案问题

    我对标签数据库模式的 Toxi 解决方案感到有点困惑 我正在开发一个系统 用户可以向该系统提交项目 并且这些项目可以具有与其关联的标签 在阅读了 tagchemas 后 我发现 Toxi 解决方案最适合我的需求 但是 我不完全确定我的计划是
  • 数据库优化命令

    在用户可以下订单的数据库中 最好有一个包含地址的新表 还是每个订单的标题中都有地址数据 这不仅涉及用户 及其地址 还涉及您所销售产品的价格和其他信息 这些信息可能会发生变化after订单已下达 但订单本身必须保持完整 一般来说 有两种方法
  • SQL原型设计:面对使用varchar(N)静默截断数据——有更好的选择吗? (天数据)

    情况 varchar 20 好像默默地截断在 Teradata 和not当遇到长度超过 20 个字符的字符串时扩展或抱怨 这有点令人惊讶 因为我预计列会自动扩展以适应更大的字符串 例如 30 个字符 或者如果更大的字符串会抛出错误遇到字符串
  • 博客的 mongodb 架构设计

    您将如何为具有基于文档的数据库 mongodb 的类似博客的网站设计架构 该站点具有以下对象 用户 文章 评论 用户可以向文章添加评论 每个用户还可以为每个评论投票一次 我希望能够有效地执行这些查询 1 获取文章A 文章A的评论以及每个评论
  • 用户评级的 ER 模型

    我有很多 用户 每个用户最多有 5 个 服务 用户应该能够对每项服务进行评分 0 5 我还想保留用户的平均评分 这是我的想法 但是还有更好的方法吗 User id user name dob 服务 固定数量的服务 id service de
  • 在数据库设计中什么时候需要使用一对一关系?

    在数据库设计中什么时候需要使用一对一关系 在我看来 如果两个表是一对一的关系 那么它们可以合并成一个表 这是真的 对大型表进行垂直分区以减少 I O 和缓存需求 将经常查询的列与很少查询的列分开 向生产系统添加列时alter table就是
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • InnoDB 或 MyISAM - 为什么不两者都使用呢?

    我读过各种关于两者之间哪个更好的主题InnoDB and MyISAM 看来争论的都是使用还是其他 根据表的不同 是否不能同时使用两者 这样做会有什么缺点 据我所知 发动机可以在CREATE TABLE命令 因此 某些经常读取的表可以设置为
  • 如何在Oracle数据库11g中创建新模式/新用户?

    我已经申请了一家公司的实习机会 作为一个问题 他们要求我为他们的公司创建一个具有一定要求的架构 并将DDL文件 我已经安装了 Oracle 数据库 11g Express 版本 但如何在 Oracle 数据库 11g 中创建新架构 我在网上
  • 如何为 apscheduler 指定“记录器”

    我正在尝试学习如何使用 Python 的 apscheduler 包 但它会定期抛出以下错误 No handlers could be found for logger apscheduler scheduler 该消息似乎与计划作业中的错
  • 具有不同组合的产品和产品包的数据库模型

    您将如何设计数据库来实现此功能 考虑一个场景 我们想要创建一个产品关系 封装 假设我们创建一个产品表 prod id prod name prod fee 1 prepaid A 19 usd 2 prepaid B 29 usd 3 pr
  • 如何正确设计数据库的这一部分(循环引用?)

    情况 一个公司有很多项目一个项目有很多标签一个项目只属于1家公司一个标签可以属于多个项目公司必须有权访问自己的标签 示例1 在第一张图片中 公司的所有标签都可以通过projects project tag 获得 但如果所有项目都被删除 那么
  • 如何设计具有主键和多值属性的表?

    我对数据库设计很感兴趣 现在正在阅读相应的文献 通过这本书 我遇到了一个让我感到不确定的奇怪例子 有一个关系 在此表中 我们有一个复合主键 StudentID Activity 但ActivityFee部分依赖于表的key Activity

随机推荐