2016-05-22 3 views
0

Ich entwickle eine Datenbankanwendung, die Scores berechnet und das Ranking von Personen zeigt. Was ich tue, ist das Ausführen von Prozeduren, die die Scores berechnen und diese Scores in einer Datenbanktabelle speichern. Daraus wird ein Endergebnis berechnet. Ich zeige dann das Ranking nach der Punktzahl.Hauptdaten vorübergehend in der Datenbank für jeden Benutzer

Worum ich mir Sorgen mache, ist folgendes: Was wäre, wenn zwei Benutzer gleichzeitig die Anwendung benutzen? Wenn einer die Punkte bereits berechnet hat und kurz bevor der Punktestand abgerufen wird, führt der andere Benutzer die Prozedur aus und überschreibt die Tabelle. Da verschiedene Benutzer verschiedene Parameter angeben können, unterscheiden sich die Tabellen. Gibt es eine Möglichkeit, eine eindeutige Tabelle für jeden einzelnen simultanen Benutzer zu erstellen, der gerade diese Anwendung verwendet?

Datenbank: Oracle

+1

Müssen Sie tatsächlich die Ergebnisse materialisieren? Es ist sicherlich möglich, sie in eine temporäre Tabelle zu schreiben (obwohl das in dreischichtigen Anwendungen, in denen die Anwendungssitzung nicht sauber auf eine Datenbanksitzung abgebildet wird, etwas herausfordernd ist). Normalerweise würden Sie das Ergebnis nicht materialisieren, Sie hätten einfach eine gespeicherte Prozedur, die eine Abfrage basierend auf den von Ihnen benötigten Parametern ausführt und eine Ergebnismenge an den Aufrufer zurückgibt. –

+0

Was meinst du mit 'Ergebnismenge'? Meinst du, eine Prozedur kann etwas wie einen Tisch zurückgeben? – grindel

+0

Eine Funktion kann einen 'sys_refcursor' zurückgeben, der nur das Ergebnis einer Abfrage ist. Eine Prozedur kann auch einen out-Parameter vom Typ sys_refcursor haben. –

Antwort

0

Verwenden Sie eine temporäre Tabelle für die Zwischenergebnisse. Eine Kopie der Tabelle wird für jede Datenbanksitzung instanziiert, so dass es bei parallelen Anwendungen der Anwendung keine Interferenz gibt.

Beispiel:

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 ... 

Alternativ eine Benutzer-ID in die Tabelle in dem die Spielstände zu berechnen auseinander Ergebnisse für verschiedene Benutzer zu halten (zB durch einen Fremdschlüssel Hinzufügen einer Benutzeridentifikationstabelle verweist.).

Schließlich könnten Sie die Score-Berechnung auf eine gespeicherte Prozedur in ein Paket plsql verpackt verschieben. Diese Pakete werden ebenfalls von db session instanziiert.

Update (Anwendungsarchitektur)

Als Justin Cave Noten wird zusätzliche Logik für Mehrschichtige Anwendungen benötigt, wo Datenbanksitzungen geteilt werden zwischen Anwendungsbenutzer.

Bei Ihrer Beschreibung hängt der Endergebnis von einem Parametersatz ab (der für mehrere Benutzer identisch sein kann), der sich wahrscheinlich im Datenmodell widerspiegeln sollte (Beispiel: 'Parametersätze' könnten eine Tabelle ihrer sein Eigene, die eine "final_score" -Spalte enthalten Eine Tabelle "ranking" könnte aus FKs zu den Tabellen 'parameter set' und 'user' und einer Spalte 'score' bestehen Die 'user' -Tabelle würde einen FK auf 'parameter sets' enthalten. Eine Benutzerabfrage für ihre Bewertung würde dann in eine Abfrage für die Bewertung bei einem bestimmten Parametersatz übersetzt).

+0

Also, wenn in einem Büro, zwei Mitarbeiter die Anwendung gleichzeitig verwenden, wird die temporäre Tabelle verschiedene Daten für beide enthalten? Also wird es zu dieser Zeit zwei Instanzen der gleichen Tabelle geben? – grindel

+0

@grindel ja, das ist richtig. Siehe [dieser Oracle-Basisartikel] (https://oracle-base.com/articles/misc/temporary-tables) oder die Antworten auf [diese SO-Frage] (http://stackoverflow.com/questions/2671518/how- to-create-a-temporäre-Tabelle-in-Orakel). Technisch gesehen gibt es s Single Table serverseitig; Die darin enthaltenen Daten werden jedoch von db session isoliert, sodass aus Sicht des Benutzers in der Tat 1 Instanz pro Sitzung vorhanden ist. – collapsar

+1

@grindel - Es würde nur einen Tisch geben. Jede Sitzung konnte nur die Daten sehen, die für ihre Sitzung lokal waren. Das funktioniert gut in alten Client/Server-Anwendungen. In einer dreischichtigen Anwendung, in der die zwei Benutzer unterschiedliche Anwendungssitzungen haben, die mittlere Schicht jedoch einen Pool von Datenbankverbindungen verwaltet, so dass eine Anwendungssitzung viele verschiedene Datenbankverbindungen verwenden kann und mehrere Anwendungssitzungen dieselbe Datenbankverbindung zu verschiedenen Zeitpunkten verwenden können das Leben wird komplizierter. –

Verwandte Themen