Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle数据库设计视图还是表?_Oracle_Database Design_View - Fatal编程技术网

Oracle数据库设计视图还是表?

Oracle数据库设计视图还是表?,oracle,database-design,view,Oracle,Database Design,View,我是数据库设计新手,在尝试设计数据库时遇到了一个问题。这是我的系统: 有3种不同的软件(软件A、软件B、软件C)和500-600个用户。每个用户都可以使用任何软件并做一些工作。每项工作大约每分钟发送到数据库6次。(用户和软件随机) 我想要一个数据库来保存与软件相关的所有用户操作以供存档,还想要跟踪与这些软件相关的所有用户的即时操作。(仅针对每个软件的不同用户的最新操作) 所以我设计了这样的东西: 表:SW_X_数据_归档 栏目: 用户ID 数据更新日期 SW_A_ActionID 表:SW_

我是数据库设计新手,在尝试设计数据库时遇到了一个问题。这是我的系统: 有3种不同的软件(软件A、软件B、软件C)和500-600个用户。每个用户都可以使用任何软件并做一些工作。每项工作大约每分钟发送到数据库6次。(用户和软件随机) 我想要一个数据库来保存与软件相关的所有用户操作以供存档,还想要跟踪与这些软件相关的所有用户的即时操作。(仅针对每个软件的不同用户的最新操作)

所以我设计了这样的东西:

表:SW_X_数据_归档

栏目:

  • 用户ID
  • 数据更新日期
  • SW_A_ActionID
表:SW_X_即时_数据

栏目:

  • 用户ID
  • 数据更新日期
  • SW_X_ActionID
当一个新数据出现时,如果该用户ID存在,它将更新INSTANT_数据表的相关行,如果不存在,则插入带有用户ID和数据的新行。然后将相同的数据插入到数据归档表中

问题是:有没有更好的方法来做这类工作?也许吧? (我读过一些关于物化视图的文章,但不知道如何在这里使用。)
感谢

仅为每个软件的不同用户提供最新操作

您的即时表上应该有一个唯一的复合键(USERID,SOFTWAREID),这样就不可能有多个与用户使用软件相关的行

存档表不需要这样的唯一键或约束

如果(用户ID、软件)的行不存在,则将
插入到INSTANT中;如果行已存在,则将
更新该行

通常,insert/update触发器会放置在INSTANT表上,以便在INSTANT发生更改时将一行插入存档


编辑:或者,您可以维护一个表,并拥有一个视图,该视图仅为每个软件的每个用户选择最新的操作。您需要为每个操作添加时间戳,并在(USERID、SOFTWAREID)上放置一个复合索引(非唯一)。采取哪种方法的决定可能基于相对性能。如果经常需要最新的操作信息,我倾向于使用触发器。

很抱歉,我写了SW_X_INSTANT来解释每种软件类型都有即时表。SW_A_INSTANT_数据、SW_B_INSTANT_数据等。因此,对于INSTANT_数据表,用户ID是唯一的。是的,数据将直接插入存档。没有限制。谢谢你的回答,蒂姆。我还将尝试创建一个视图,该视图将从用户ID唯一的软件归档表中获取最新数据。。这将是另一个问题:)具体化视图是否会帮助您或伤害您的问题取决于您将如何处理数据。如果几乎所有的检索都只涉及存储在INSTANT_数据中的项,那么您当前的设计可能是最好的。否则,您最好设计一个单独的表,使用只为每个用户提取最新行的视图。这个视图编写起来并不简单,即使有很好的索引,也不会运行得太快。