Oracle数据库设计视图还是表?
我是数据库设计新手,在尝试设计数据库时遇到了一个问题。这是我的系统: 有3种不同的软件(软件A、软件B、软件C)和500-600个用户。每个用户都可以使用任何软件并做一些工作。每项工作大约每分钟发送到数据库6次。(用户和软件随机) 我想要一个数据库来保存与软件相关的所有用户操作以供存档,还想要跟踪与这些软件相关的所有用户的即时操作。(仅针对每个软件的不同用户的最新操作) 所以我设计了这样的东西: 表:SW_X_数据_归档 栏目:Oracle数据库设计视图还是表?,oracle,database-design,view,Oracle,Database Design,View,我是数据库设计新手,在尝试设计数据库时遇到了一个问题。这是我的系统: 有3种不同的软件(软件A、软件B、软件C)和500-600个用户。每个用户都可以使用任何软件并做一些工作。每项工作大约每分钟发送到数据库6次。(用户和软件随机) 我想要一个数据库来保存与软件相关的所有用户操作以供存档,还想要跟踪与这些软件相关的所有用户的即时操作。(仅针对每个软件的不同用户的最新操作) 所以我设计了这样的东西: 表:SW_X_数据_归档 栏目: 用户ID 数据更新日期 SW_A_ActionID 表:SW_
- 用户ID
- 数据更新日期
- SW_A_ActionID
- 用户ID
- 数据更新日期
- SW_X_ActionID
感谢
仅为每个软件的不同用户提供最新操作
您的即时表上应该有一个唯一的复合键(USERID,SOFTWAREID),这样就不可能有多个与用户使用软件相关的行
存档表不需要这样的唯一键或约束
如果(用户ID、软件)的行不存在,则将插入到INSTANT中;如果行已存在,则将更新该行
通常,insert/update触发器会放置在INSTANT表上,以便在INSTANT发生更改时将一行插入存档
编辑:或者,您可以维护一个表,并拥有一个视图,该视图仅为每个软件的每个用户选择最新的操作。您需要为每个操作添加时间戳,并在(USERID、SOFTWAREID)上放置一个复合索引(非唯一)。采取哪种方法的决定可能基于相对性能。如果经常需要最新的操作信息,我倾向于使用触发器。很抱歉,我写了SW_X_INSTANT来解释每种软件类型都有即时表。SW_A_INSTANT_数据、SW_B_INSTANT_数据等。因此,对于INSTANT_数据表,用户ID是唯一的。是的,数据将直接插入存档。没有限制。谢谢你的回答,蒂姆。我还将尝试创建一个视图,该视图将从用户ID唯一的软件归档表中获取最新数据。。这将是另一个问题:)具体化视图是否会帮助您或伤害您的问题取决于您将如何处理数据。如果几乎所有的检索都只涉及存储在INSTANT_数据中的项,那么您当前的设计可能是最好的。否则,您最好设计一个单独的表,使用只为每个用户提取最新行的视图。这个视图编写起来并不简单,即使有很好的索引,也不会运行得太快。