2016-04-04 16 views
0

Ich erstelle ein POS-ähnliches System und ich bin nicht wirklich sicher, wie man den Einkaufswagen Teil, wo der Kassierer alle Artikel des Kunden (aus dem Inventar Tabelle), haben die eingegebenen Artikel eine einzige Transaktionsnummer, genau wie in den Quittungen.POS (Einkaufswagen) - Mehrere Artikel in einer einzigen Transaktion Nein

Soll ich eine Trans_No-Spalte in die Cart-Tabelle einfügen? Wenn ja, wie gehe ich mit der Zuordnung einer einzelnen Trans_No zu mehreren Elementen um? Ich denke daran, die letzte Trans_No zu bekommen und diese auf 1 zu erhöhen, dann lege sie allen Artikeln im Einkaufswagen des Casher zu. Aber es gibt eine große Möglichkeit, dass, wenn 2 Kassierer gleichzeitig das System verwenden, sie beide die gleiche letzte Transaktion # abrufen und sie beide auf 1 erhöhen, was dazu führt, dass die Bestellung von 2 Kunden in 1 einzelne Transaktion/Quittung zusammengeführt wird.

Was ist der beste Weg, damit umzugehen?

Antwort

1

Das Datenobjekt, auf dem Ihre Transaktions-ID steht, hängt von den funktionalen Anforderungen Ihrer Anwendung ab. Wenn sich in einem Einkaufswagen eine Transaktions-ID befindet, ist die Warenkorb-Tabelle der richtige Ort für die Transaktions-ID.

Datenbanksysteme bieten eine Vielzahl von Funktionen, um das Problem der gleichzeitigen Erhöhung zu vermeiden, das Sie beschreiben. Der einfachste Weg, dies zu vermeiden, ist die Verwendung eines serial Datentyps, wie er z. von PostgreSQL. Wenn Sie eine Spalte als seriell deklarieren, sorgt die Datenbank dafür, dass für jeden einzufügenden Datensatz ein neuer Wert generiert wird.

Wenn kein solcher Datentyp verfügbar ist, kann möglicherweise noch ein Mechanismus zum Generieren eines eindeutigen Primärschlüssels für einen Datensatz vorhanden sein. Ein Beispiel ist die auto_increment Direktive für MySQL.

Wenn alle diese für Sie nicht realisierbar sind, z. Da Sie eine ausgeklügelte Logik zum Generieren Ihrer Transaktions-IDs haben möchten, müssen Sie die Logik des Lesens, Inkrementierens und Speicherns des Werts in eine Datenbanktransaktion einschließen. Anweisungen wie

start transaction; 
select key from current_key; 
update current_key set key = :key + 1; 
commit; 

werden Kollisionen auf dem Schlüsselwert verhindern. Stellen Sie jedoch sicher, dass Ihre Transaktionen kurz sind, insbesondere wenn Sie eine Transaktion während einer Wartezeit auf Benutzereingaben nicht geöffnet lassen. Andernfalls werden die Transaktionen anderer Benutzer möglicherweise zu lange blockiert.

+0

Hallo TAM, danke für die Antwort! Wenn Sie an den eindeutigen Primärschlüssel denken, den Sie erwähnt haben, habe ich gerade eine Funktion erstellt, die beim Hinzufügen eines Elements zum Warenkorb einen Wert in einem Label mit der generierten ID unter Verwendung des formatierten DATETIME plus der Benutzer-ID (z Sicher, dass dies nicht dupliziert wird, obwohl es von mehreren Benutzern verwendet wird, da die Benutzer-ID im generierten Primärschlüssel hinzugefügt wurde. Wenn Sie den Einkaufswagen mit mehreren Artikeln auschecken, wird er in eine Tabelle eingefügt, in der die Artikel PK vom Etikett enthalten sind. Danke für deine Idee! –