Count oder Manuell mitzählen

Count oder Manuell mitzählen

am 10.01.2006 21:15:54 von Ralf Rimmerg

Ich möchte Adressen für Onlineanmeldungen in einer Datenbankspeichern. Es
existieren mehrere Events gleichzeitig.
Man kann sich anmelden, aber auch eine Anmeldung stornieren. Für jeden Event
gibt es ein Limit für die Anmeldungen.

Nun frage ich mich, was besser ist:

1. Jede Anmeldung in der Tabelle für Events mit zählen (eigene Spalte für
die Anzahl)

2. Bei jeder Abfrage die Anmeldungen zählen.

Ich weiß leider nicht, was für einen Aufwand es für MySQL ist, Datensätze zu
zählen.

Was würdet Ihr empfehlen?

Hier eine vereinfachte Struktur

CREATE TABLE `events` (
`ID` mediumint(8) unsigned NOT NULL auto_increment,
`Title` varchar(200) default NULL,
`ParticipantLimit` smallint(5) unsigned default NULL,
PRIMARY KEY (`ID`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=4 ;

CREATE TABLE `events_addresses` (
`ID` mediumint(8) unsigned NOT NULL auto_increment,
`Name` varchar(40) NOT NULL default '',
`EventID` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`ID`)
) TYPE=MyISAM;

Re: Count oder Manuell mitzählen

am 10.01.2006 21:52:27 von Nico Haase

Hallöchen,
*Ralf Rimmerg* schrub:
> 2. Bei jeder Abfrage die Anmeldungen zählen.
>
> Ich weiß leider nicht, was für einen Aufwand es für MySQL ist,
> Datensätze zu zählen.

Kaum einer. Mach es besser so.
mfg
Nico

--
www.buchtips.net - Rezensionen online

Re: Count oder Manuell mitzählen

am 11.01.2006 15:06:47 von Ralf Rimmerg

Danke. Werde ich so machen...


"Nico Haase" schrieb im Newsbeitrag
news:100106.dcdm.21.dlg@news.nicohaase.de...
> Hallöchen,
> *Ralf Rimmerg* schrub:
>> 2. Bei jeder Abfrage die Anmeldungen zählen.
>>
>> Ich weiß leider nicht, was für einen Aufwand es für MySQL ist,
>> Datensätze zu zählen.
>
> Kaum einer. Mach es besser so.
> mfg
> Nico
>
> --
> www.buchtips.net - Rezensionen online

Re: Count oder Manuell mitzählen

am 11.01.2006 16:15:21 von Axel Schwenke

"Ralf Rimmerg" wrote:
> Ich möchte Adressen für Onlineanmeldungen in einer Datenbankspeichern. Es
> existieren mehrere Events gleichzeitig.
> Man kann sich anmelden, aber auch eine Anmeldung stornieren. Für jeden Event
> gibt es ein Limit für die Anmeldungen.
>
> Nun frage ich mich, was besser ist:
>
> 1. Jede Anmeldung in der Tabelle für Events mit zählen (eigene Spalte für
> die Anzahl)
>
> 2. Bei jeder Abfrage die Anmeldungen zählen.

Ich votiere für 1.

Gründe:

1. Du brauchst ohnehin irgendwo die Anzahl der buchbaren Plätze. Also
ist es sinnvoll, zu jedem Event die Anzahl verfügbarer Plätze zu
speichern und bei jeder Buchung zu dekrementieren (inkrementieren
bei Stornierung).

2. SELECT COUNT(*) WHERE = ist zwar
schnell, aber noch viel schneller ist SELECT event, frei ...
Vermutlich wirst du die Anzeige der Events und der jeweils verfüg-
baren Plätze öfter brauchen als Buchung/Stornierung, also ist es
sinnvoll, diese Operation zu optimieren.

3. Konsistenz.
UPDATE events SET frei=frei-1 WHERE event_id=... AND frei>0
ist atomar und kann nicht überbuchen. Eine Lösung mit COUNT()
garantiert dir das nicht.

Du brauchst noch nicht mal Transaktionen oder sowas. Beim Buchen
einfach obiges UPDATE und dann affected_rows == 1 prüfen. Falls das
UPDATE erfolgreich war, den Buchungssatz schreiben. Stornierung
klappt ja sowieso immer.


XL

Re: Count oder Manuell mitzählen

am 11.01.2006 17:10:59 von Kai Ruhnau

Axel Schwenke wrote:
> "Ralf Rimmerg" wrote:
>
>>Ich möchte Adressen für Onlineanmeldungen in einer Datenbankspeichern. Es
>>existieren mehrere Events gleichzeitig.
>>Man kann sich anmelden, aber auch eine Anmeldung stornieren. Für jeden Event
>>gibt es ein Limit für die Anmeldungen.
>>
>>Nun frage ich mich, was besser ist:
>>
>>1. Jede Anmeldung in der Tabelle für Events mit zählen (eigene Spalte für
>>die Anzahl)
>>
>>2. Bei jeder Abfrage die Anmeldungen zählen.
>
>
> Ich votiere für 1.

[snip]

> 3. Konsistenz.
> UPDATE events SET frei=frei-1 WHERE event_id=... AND frei>0
> ist atomar und kann nicht überbuchen. Eine Lösung mit COUNT()
> garantiert dir das nicht.
>
> Du brauchst noch nicht mal Transaktionen oder sowas. Beim Buchen
> einfach obiges UPDATE und dann affected_rows == 1 prüfen. Falls das
> UPDATE erfolgreich war, den Buchungssatz schreiben. Stornierung
> klappt ja sowieso immer.

Zusätzlich zu diesem Vorgehen würde ich noch hergehen und anstelle von
`frei` zwei Felder, `insgesamt` und `belegt`, das ändert nichts daran,
dass das UPDATE atomar abläuft, hält allerdings die Plätze insgesamt
immer direkt verfügbar.

Ich habe hier bei eingehenden Bestellungen zu Anfang auch die Gesamtzahl
solange dekrementiert bis 0 herauskam. Die Abfragen zwischendurch waren
damit allerdings nicht besonders sprechend und später eine Auswertung
nicht mehr möglich.

Grüße
Kai