【问题标题】:Main data temporarily in the database for each user每个用户在数据库中临时存储的主要数据
【发布时间】:2016-05-22 18:42:09
【问题描述】:

我正在开发一个数据库应用程序,它可以计算分数并显示人们的排名。我正在做的是执行计算分数并将这些分数存储在数据库表中的程序。由此计算最终得分。然后我根据分数显示排名。

我担心的是:如果两个用户同时使用该应用程序会怎样。如果一个人已经计算了分数并且就在检索分数之前,另一个用户执行该过程并覆盖该表。 由于不同的用户可以指定不同的参数,所以表格会有所不同。有什么方法可以为当前使用该应用程序的每个唯一同时用户创建一个唯一表?

数据库:甲骨文

【问题讨论】:

  • 你真的需要实现结果吗?将它们写入临时表当然是可能的(尽管这在应用程序会话没有干净地映射到数据库会话的三层应用程序中变得有点挑战)。通常,您不会具体化结果,您只需有一个存储过程,该过程根据您需要的任何参数运行查询并将结果集返回给调用者。
  • “结果集”是什么意思?你的意思是一个过程可以返回类似表格的东西吗?
  • 一个函数可以返回一个sys_refcursor,这只是一个查询的结果。一个过程也可以有一个out 类型的sys_refcursor 参数。

标签: database oracle


【解决方案1】:

为中期结果使用临时表。为每个数据库会话实例化一个表的副本,因此不会干扰应用程序的并行使用。

例子:

CREATE GLOBAL TEMPORARY TABLE schema.table (
    col_pk          NUMBER PRIMARY KEY
  , col_score       NUMBER
  , col_whatever    VARCHAR2(4000)
) ON COMMIT PRESERVE ROWS; -- alternative: ON COMMIT DELETE ROWS; does the obvious thing ...

或者,将用户 ID 添加到计算分数的表中(例如,通过添加引用用户标识表的外键)以将不同用户的结果分开。

最后,您可以将分数计算转移到包装到 plsql 包中的存储过程中。这些包也由 db session 实例化。

更新(应用架构)

正如Justin Cave 所说,在应用程序用户之间共享数据库会话的多层应用程序需要额外的逻辑。

根据您的描述,最终得分取决于参数集(对于多个用户可能相同),这可能应该反映在数据模型中(例如:“参数集”可能是他们自己的表,包含“final_score”列。表“排名”可能由表“参数集”和“用户”的 FK 以及“分数”列组成。“用户”表将包含“参数集”上的 FK。A然后,用户对其分数的查询将被转换为给定特定参数集的分数查询)。

【讨论】:

  • 那么,如果在办公室,两名员工同时使用该应用程序,临时表会为他们保存不同的数据?那么,到时候,同一张表会有两个实例吗?
  • @grindel 是的,没错。请参阅this oracle base articlethis SO question 的答案。从技术上讲,iirc 有一个单表服务器端;但是,它包含的数据是由 db session 隔离的,因此从用户的角度来看,每个 session 确实有 1 个实例。
  • @grindel - 只有一张桌子。每个会话将只能看到其会话本地的数据。这在老式的客户端/服务器应用程序中运行良好。在一个三层应用程序中,两个用户有不同的应用程序会话,但中间层维护一个数据库连接池,这样一个应用程序会话可能会使用许多不同的数据库连接,而多个应用程序会话可能会在不同的时间点使用相同的数据库连接,生活变得更加复杂。
猜你喜欢
  • 2013-05-28
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多