问题描述
嗨,AskTom团队,
我想要您对数据模型设计和/或Oracle功能的想法,我可以利用这些想法来实现以下描述的设计目标。
Background:
我正处于为全新的APEX应用程序设计数据模型的早期阶段。该应用程序的目的是允许不同的用户组创建,维护和报告学校的预算。我计划使用VPD允许每所学校拥有自己的私人区域,每年可以在其中管理预算。
Requirement:
每所学校可能有一个或多个用户提交其部门的预算; 在某些情况下,学校有一个财务委员会,希望 “快照” 预算并将其标记为已批准的 “初步” 预算; 经过进一步的更改和调整,在今年晚些时候,他们可能会再次 “快照” 它,并将其标记为批准的 “运营” 预算。有些学校有不同的过程,有不同的阶段-所以我认为需要一个通用的快照/版本控制数据模型。他们希望能够报告预算的任何快照 (尽管我怀疑只需要在 “最新” 或当前版本上进行编辑-即没有分支)。他们还想报告快照之间的增量。
每所学校都有一个或多个校园,部门和年份级别。每个部门可以提供一个或多个主题。每所学校可以维持一个或多个预算,每个预算包括预算项目的集合。每个预算的部门,科目和年度级别都分别维护,因为它们每年经常变化。
Note: The LiveSQL link is to a sample schema to give an idea of what I'm describing; it's not the final product and will probably change a lot as I learn more about the client's requirements.
Alternatives:
Option 0.向后推-建议客户端 “YAGNI”,并且不支持版本控制。这可能不会被接受,或者他们会找到解决方法 (例如创建名为 “v1”,“v2”,“v2 final” 等预算),然后要求稍后进行系统更改以添加版本控制功能无论如何...
Option 1.预算的多个 “版本” 将作为预算表中的新行创建,并复制所有子数据。数据库没有任何版本的明确概念-此含义由用户根据预算名称 (例如 'Budget v1','Budget v2 ') 分配。
Option 2.添加 “快照” 表作为预算的子级。在预算表和所有子表中添加一个升序的 “version_id” 列。每当插入,更新或删除任何记录时,version_id都会递增; 通过查找version_id <= 快照的version_id的所有记录来查询快照。不会删除任何记录 (而是通过状态列实现 “软删除”)。有点类似于这里提出的想法:https://stackoverflow.com/a/12981862/103295
Option 3.添加 “快照” 表作为预算的子级。将snapshot_id添加到所有子表,包括预算,部门,预算行等。将VPD策略扩展为一次仅显示一个快照-允许学校用户选择他们希望查看的快照。快照只是另一个快照的完整副本。一个挑战是,如果VPD策略隐藏了其他快照,则将创建当前快照和另一个快照之间的增量报告。
Option x.还有别的吗?
Challenges:
*Application complexity-例如,如果可能的话,避免复杂的查询和DML逻辑; 更喜欢简单的逻辑来进行版本控制,即创建快照并回滚到较早的快照应该是相对简单的DML操作
*Conceptual model complexity-例如,更喜欢UI中呈现的概念,该概念可以被广泛的用户容易理解和使用; 由于员工流失,大多数用户将有效地 “新工作”; 尽可能隐藏复杂性
*Query performance-例如查询当前版本,快照或比较两个快照以计算增量时
非常感谢。
我想要您对数据模型设计和/或Oracle功能的想法,我可以利用这些想法来实现以下描述的设计目标。
Background:
我正处于为全新的APEX应用程序设计数据模型的早期阶段。该应用程序的目的是允许不同的用户组创建,维护和报告学校的预算。我计划使用VPD允许每所学校拥有自己的私人区域,每年可以在其中管理预算。
Requirement:
每所学校可能有一个或多个用户提交其部门的预算; 在某些情况下,学校有一个财务委员会,希望 “快照” 预算并将其标记为已批准的 “初步” 预算; 经过进一步的更改和调整,在今年晚些时候,他们可能会再次 “快照” 它,并将其标记为批准的 “运营” 预算。有些学校有不同的过程,有不同的阶段-所以我认为需要一个通用的快照/版本控制数据模型。他们希望能够报告预算的任何快照 (尽管我怀疑只需要在 “最新” 或当前版本上进行编辑-即没有分支)。他们还想报告快照之间的增量。
每所学校都有一个或多个校园,部门和年份级别。每个部门可以提供一个或多个主题。每所学校可以维持一个或多个预算,每个预算包括预算项目的集合。每个预算的部门,科目和年度级别都分别维护,因为它们每年经常变化。
Note: The LiveSQL link is to a sample schema to give an idea of what I'm describing; it's not the final product and will probably change a lot as I learn more about the client's requirements.
Alternatives:
Option 0.向后推-建议客户端 “YAGNI”,并且不支持版本控制。这可能不会被接受,或者他们会找到解决方法 (例如创建名为 “v1”,“v2”,“v2 final” 等预算),然后要求稍后进行系统更改以添加版本控制功能无论如何...
Option 1.预算的多个 “版本” 将作为预算表中的新行创建,并复制所有子数据。数据库没有任何版本的明确概念-此含义由用户根据预算名称 (例如 'Budget v1','Budget v2 ') 分配。
Option 2.添加 “快照” 表作为预算的子级。在预算表和所有子表中添加一个升序的 “version_id” 列。每当插入,更新或删除任何记录时,version_id都会递增; 通过查找version_id <= 快照的version_id的所有记录来查询快照。不会删除任何记录 (而是通过状态列实现 “软删除”)。有点类似于这里提出的想法:https://stackoverflow.com/a/12981862/103295
Option 3.添加 “快照” 表作为预算的子级。将snapshot_id添加到所有子表,包括预算,部门,预算行等。将VPD策略扩展为一次仅显示一个快照-允许学校用户选择他们希望查看的快照。快照只是另一个快照的完整副本。一个挑战是,如果VPD策略隐藏了其他快照,则将创建当前快照和另一个快照之间的增量报告。
Option x.还有别的吗?
Challenges:
*Application complexity-例如,如果可能的话,避免复杂的查询和DML逻辑; 更喜欢简单的逻辑来进行版本控制,即创建快照并回滚到较早的快照应该是相对简单的DML操作
*Conceptual model complexity-例如,更喜欢UI中呈现的概念,该概念可以被广泛的用户容易理解和使用; 由于员工流失,大多数用户将有效地 “新工作”; 尽可能隐藏复杂性
*Query performance-例如查询当前版本,快照或比较两个快照以计算增量时
非常感谢。
专家解答
所以我对此的理解是:
-每个学校都有年度预算
-每个部门/校园/年份/...准备他们的预算
-然后发送批准
-在这一点之后,每个部门/校园/年份/...可能会对预算进行进一步的修改。但是您需要报告当前状态,每个区域的预算
-该周期在一年内可以重复几次
虽然选项2中的版本控制模型启用了此功能,但我认为它会使您的SQL变得过于复杂。
选项1可以工作,但感觉不对;) 一个部门可以进行100编辑,其他部门只能进行几次编辑或不进行编辑。所以你复制了很多数据。或者他们都做了很多编辑,但是在不同的时间。无论哪种方式,您最终都会复制大量数据。
所以我倾向于选择3。创建快照表。当用户批准/快照预算时,您将所有当前预算行复制到此。添加代理密钥并捕获快照日期,以便您可以比较版本。如果你需要捕捉委员会对预算的评论,你可以把它们存储在这里。
当然,如果您需要比较正在进行的预算版本,这无济于事。如果确实需要此功能,请将闪回数据存档添加到工作表中。这使您能够通过闪回查询在过去的时间内获得预算的所有行的状态:
其他人欢迎添加他们对如何做到这一点的想法和建议。
-每个学校都有年度预算
-每个部门/校园/年份/...准备他们的预算
-然后发送批准
-在这一点之后,每个部门/校园/年份/...可能会对预算进行进一步的修改。但是您需要报告当前状态,每个区域的预算
-该周期在一年内可以重复几次
虽然选项2中的版本控制模型启用了此功能,但我认为它会使您的SQL变得过于复杂。
选项1可以工作,但感觉不对;) 一个部门可以进行100编辑,其他部门只能进行几次编辑或不进行编辑。所以你复制了很多数据。或者他们都做了很多编辑,但是在不同的时间。无论哪种方式,您最终都会复制大量数据。
所以我倾向于选择3。创建快照表。当用户批准/快照预算时,您将所有当前预算行复制到此。添加代理密钥并捕获快照日期,以便您可以比较版本。如果你需要捕捉委员会对预算的评论,你可以把它们存储在这里。
当然,如果您需要比较正在进行的预算版本,这无济于事。如果确实需要此功能,请将闪回数据存档添加到工作表中。这使您能够通过闪回查询在过去的时间内获得预算的所有行的状态:
select * from buget_lines as of timestamp ...复制
其他人欢迎添加他们对如何做到这一点的想法和建议。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1325次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
794次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
725次阅读
2025-03-06 09:41:49
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
559次阅读
2025-03-05 00:42:34
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
467次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
358次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
315次阅读
2025-03-26 23:27:33
Oracle分区和执行计划相关的几个问题
听见风的声音
309次阅读
2025-03-07 08:51:42
数据库管理-第299期 数据库是否需要定期重启(20250306)
胖头鱼的鱼缸
252次阅读
2025-03-06 09:09:35
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
247次阅读
2025-03-19 14:41:51