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

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(使用前将#替换为@)

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

  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • JSON 值的模式匹配

    运行 Postgres 12 5 的本地 docker 实例 4MBwork mem 我正在实施这个图案 https dba stackexchange com q 108447 3684搜索 json 中的任意字段 目标是搜索并返回 JS
  • 在 SQL Server 2005 IMAGE 列中存储 20 Meg 文件的最有效方法

    我们将文档存储在 SQL Server 2005 数据库表中 列格式为 Image 每次我尝试存储大于 1 Meg 的 PDF 文件时 它都会以某种方式损坏 NET 中是否有任何特别有效的方法来序列化大文件 10megs 并将其存储到数据库
  • 如何正确设计数据库的这一部分(循环引用?)

    情况 一个公司有很多项目一个项目有很多标签一个项目只属于1家公司一个标签可以属于多个项目公司必须有权访问自己的标签 示例1 在第一张图片中 公司的所有标签都可以通过projects project tag 获得 但如果所有项目都被删除 那么
  • 当两个表非常相似时,什么时候应该将它们合并?

    我有事件和照片 然后对两者进行评论 现在 我有两个评论表 一个用于与事件相关的评论 另一个用于照片评论 架构与此类似 CREATE TABLE EventComments CommentId int EventId int Comment
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下
  • 是否值得为 SqlServer 查找表使用tinyint 而不是 int 呢?

    在 SqlServer 2005 中设计查找表 枚举 时 如果您知道条目数永远不会变得很高 是否应该使用tinyint 而不是 int 我最关心的是性能 尤其是索引的效率 假设您有这些代表性表格 Person PersonId int PK
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 需要帮助编写循环任务调度程序

    我需要编写一个工具 它将按照用户可配置的时间表运行重复任务 我将用 C 3 5 编写它 它将在 XP Windows 7 或 Windows Server 2008 上运行 完成任务大约需要 20 分钟 用户可能想要设置多种配置 例如每日
  • 数据库设计:类别在自己的表中?

    我正在将几个数据库重新设计成一个综合数据库 并且我注意到旧数据库的先前设计者喜欢将类别存储在自己的表中 例如 假设有一个表boats bid integer bname string color integer 并且在应用程序中有一个下拉框
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 数据库设计 - “推”模型,或写时扇出

    背景信息 我正在尝试检索我关注的人的图像 按最新时间排序 它就像 Twitter 新闻源 显示您朋友的最新动态 Plans 目前我只需要考虑一项 那就是图像 将来我计划分析用户的行为并将他们可能喜欢的其他图像添加到他们的提要中等 http
  • 实体框架中 1:1 关系中关联的主体端意味着什么

    public class Foo public string FooId get set public Boo Boo get set public class Boo public string BooId get set public
  • 如何将商品与定价数据正确关联,同时考虑价格变化历史记录

    事实上 所有 POS 系统都会在销售时将商品的价格直接记录到交易表中 因为该价格可能会在以后发生变化 但其销售价格应保持不变 我想知道如何设置保留价格变化历史记录的定价表 以便您可以根据商品及其销售时间将交易与该表关联起来 以获得正确的价格
  • 一个大连接或多个查询哪个提供更好的性能?

    我有一个名为订单的表 订单上的一列是 customer id我有一个名为 customers 的表 有 10 个字段 给定两个选项 如果我想构建订单对象数组并嵌入订单对象中的是客户对象 我有两个选择 选项1 A 首先查询订单表 b 循环遍历
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 如何跟踪用户在 X 天内每天访问该网站?

    Stack Overflow 上有一个新徽章 这 woot https stackoverflow com badges 71 woot enthusiast 徽章将授予连续 30 天内每天访问该网站的用户 如何实现这样的功能 如何以最简单
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 一列作为主键或两个外键作为主键

    我有以下数据库设计 An E Report有一个QAP其中有一些Requirements A QAP和它的Requirements 可以用于多个E Report Every Requirement每份电子报告中都会有 是 否 确认 我已经添
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤

随机推荐