Eine "Entity" -spezifische Sequenz

8

Hintergrund

Ich habe eine Menge verschiedener "Dinge" (ein domänenspezifischer Gegenstand / Gegenstand / Gegenstand), die für die "Ding" -Eigentümer (Menschen) sichtbar sind. Die Besitzer werden ihre "Dinge" mit einer Nummer identifizieren. Anstatt eine große "zufällige" Zahl zu zeigen, möchte ich ihnen eine kleine Zahl zeigen (vorzugsweise eine Sequenz, die bei 1 beginnt), die für Menschen einfacher ist. Die Besitzer sprechen sehr gerne von "my foo 37" und "your bar 128". Dort kann "Sequenz" Lücken haben, aber die angehängte Zahl muss während der Lebenszeit der "Sache" gleich bleiben. Also brauche ich einen Weg, um "Sache" + Besitzer spezifische ID (derzeit als "sichtbare ID") zu generieren.

Die Anzahl der "Ding" + Besitzer-Kombinationen ist im Maßstab von 10k +. Derzeit können neue "Dinge" nicht dynamisch generiert werden, aber die Eigentümer können sein.

Die Anzahl der "Ding" -Instanzen pro Besitzer ist relativ klein, ungefähr zehn pro Besitzer, aber es gibt keine feste Begrenzung, die aus den Geschäftsregeln abgeleitet werden kann. Neue "Ding" -Instanzen werden häufig erstellt und gelöscht.

Berücksichtigte Optionen

Ich fand eine gute Diskussion in einer SO-Frage Oracle Partitioned Sequence , die ziemlich genau das gleiche Problem behandelt, das ich habe.

Bisher habe ich die folgenden Optionen in Betracht gezogen:

  1. Ich denke, dass eine Standard-Datenbank-Sequenz vollkommen in Ordnung wäre, aber das würde erfordern, dass ich dynamisch eine große Anzahl von "Ding" + eigentümerspezifischen Sequenzen erstelle und auch den Sequenznamen während des Einfügens auflöse. (Und drop die Sequenzen, wenn der Besitzer weg ist.) Ich bin mir nicht sicher, ob das Erstellen einer großen Anzahl von Sequenzen überhaupt eine gute Übung ist (für mich 10k + Datenbankobjekte ist eine große Zahl).
  2. Ich habe auch berüchtigtes max(visible_id) + 1 betrachtet, aber wir werden damit normale Nebenläufigkeitsprobleme bekommen, also ist es ein No-Go.
  3. Speichern Sie die eigentümerspezifische ID nicht in der Datenbank, sondern erstellen Sie sie stattdessen in der Auswahl wie vorgeschlagen von Adam Musch . Das ist eine wunderbare Idee, aber leider muss die ID während der "Ding" -Instanzs-Lebenszeit gleich sein.
  4. Vermeiden Sie das ganze Problem, indem Sie den Eigentümern das "Ding" nennen lassen. Aber die Idee gefiel ihnen überhaupt nicht - "Warum ich mich kümmern sollte, es ist einfach so einfach, Foo 16 zu sagen." !

Frage

Gibt es eine andere Möglichkeit, dieses Problem zu beheben, oder sollte ich mit der dynamischen Erstellung von Sequenzen beginnen? Wenn die Sequenzen die Antwort sind, bitte erläutern Sie, welche Fallstricke es gibt (wie implizite Commits in DDL).

Ich bin an Oracle 11gR2- und 12c-Lösungen interessiert (wenn sie anders sind).

Pseudocode zur Veranschaulichung der Frage

%Vor%     
user272735 12.08.2016, 08:22
quelle

1 Antwort

2

Da Lücken in Ordnung sind, sollten Sie eine Variante von "Option 2" implementieren. Das Zulassen von Lücken bedeutet, dass Ihre Synchronisierung schnell durchgeführt werden kann: Bei konkurrierenden Sitzungen wird lediglich überprüft und weitergeschaltet, anstatt warten zu müssen, ob die anderen das Commit oder Rollback durchführen.

Wenn Oracle eine Option INSERT INTO..NOWAIT anbietet, wäre das einfach. Wie die Dinge sind, würde ich wahrscheinlich DBMS_LOCK einbeziehen. Hier ist meine Vorstellung davon, wie Ihre API aussehen würde.

Es macht einige Annahmen über die maximale sichtbare ID, die Sie haben, weil Sie diese Annahmen in Ihrem ursprünglichen Post gemacht haben.

%Vor%     
Matthew McPeak 18.08.2016, 15:09
quelle

Tags und Links