我正在开发一个数据库应用程序,用于计算分数并显示人员的排名。我正在做的是执行计算分数的程序并将这些分数存储在数据库表中。由此,计算最终得分。然后我根据分数显示排名。
我担心的是:如果两个用户同时使用该应用程序,该怎么办?如果已经计算了分数并且在检索分数之前,则另一个用户执行该过程并覆盖该表。 由于不同的用户可以指定不同的参数,因此表格将不同。有什么办法可以为当前使用该应用程序的每个唯一同时用户创建一个唯一的表吗?
数据库:oracle
答案 0 :(得分:0)
使用临时表作为中期结果。为每个数据库会话实例化该表的副本,因此不会干扰应用程序的并行使用。
示例:
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。然后,用户对其分数的查询将被转换为给定特定参数集的分数查询。