Oracle 数据库设计视图或表?

Posted

技术标签:

【中文标题】Oracle 数据库设计视图或表?【英文标题】:Oracle Database Design View or Table? 【发布时间】:2013-02-21 10:58:02 【问题描述】:

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

所以我设计了某事。像这样:

表:SW_X_DATA_ARCHIVE

列:

用户 ID 数据_日期 SW_A_ActionID

表:SW_X_INSTANT_DATA

列:

用户ID 数据_日期 SW_X_ActionID

当新数据到来时,如果该 UserID 存在,它会更新 INSTANT_DATA 表的相关行,如果不存在则插入带有 UserID 和数据的新行。然后将相同的数据插入到 DATA_ARCHIVE 表中。

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

【问题讨论】:

物化视图是帮助你还是伤害你的问题取决于你将如何处理数据。如果您几乎所有的检索都只关注存储在 INSTANT_DATA 中的项目,那么您目前的设计可能是最好的。否则,您最好设计一个表,其中视图只为每个用户提取最新的行。这个视图写起来并不简单,运行起来也不会非常快,即使有良好的索引。 感谢 Walter,我使用这个设计没有任何问题。 【参考方案1】:

Only the latest action for distinct users for each software

您的 INSTANT 表应该在 (USERID,SOFTWAREID) 上有一个唯一的复合键,这样就不可能有超过一行与用户对软件的使用有关。

ARCHIVE 表不需要这样的唯一键或约束。

如果 (USERID, SOFTWARE) 的行不存在,您将 insert 进入 INSTANT,如果该行已经存在,您将 update 进入。

通常,插入/更新触发器将放置在 INSTANT 表上,以便在 INSTANT 发生更改时将一行插入 ARCHIVE。

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

【讨论】:

抱歉,我写了 SW_X_INSTANT 来解释每种软件类型都存在 INSTANT 表。 SW_A_INSTANT_DATA、SW_B_INSTANT_DATA 等。因此对于 INSTANT_DATA 表,用户 ID 将是唯一的。是的,数据将直接插入到 ARCHIVE 中。没有限制。 感谢蒂姆的回答。我还将尝试创建一个视图,该视图将从 Software_Archive 表中获取最新数据,其中 UserId 是唯一的。这将是另一个问题 :)

以上是关于Oracle 数据库设计视图或表?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE主要的系统表和数据字典视图

Oracle笔记(十三) 视图同义词索引

Oracle View 与 Oracle 中的联接表

将 Oracle 表链接到 Access 2007 文件(性能)

SQL 视图或表

初识Oracle的XMLType