Sequenzen auf MySQL mittels PEAR
Sequenzen auf MySQL mittels PEAR
am 11.02.2005 10:36:28 von Jens Riedel
Hallo,
ich stelle gerade einige Anwendungen auf Datenbank-Kommunikation mittels
PEAR::DB um.
Um nicht von MySQL und der auto-increment-Funktion abhängig zu sein,
möchte ich meine IDs neuer Sätze nun über Sequenzen verwalten, was mit
$db->createSequence und $db->newId() gut klappt.
Das einzige was mich stört ist, dass für jede Tabelle eine eigene
Sequenztabelle erstellt wird, was die Übersichtlichkeit im Datenbanktool
bei ca. 20 betroffenen Tabellen doch etwas verringert.
Gibt es zufällig eine Möglichkeit, dass z.B. Sequenzen verschiedener
Tabellen in EINER Sequenztabelle verwaltet werden?
Gruß,
Jens
Re: Sequenzen auf MySQL mittels PEAR
am 11.02.2005 17:27:52 von Gerrit Beine
Jens Riedel wrote:
> Hallo,
>
> ich stelle gerade einige Anwendungen auf Datenbank-Kommunikation mittels
> PEAR::DB um.
> Um nicht von MySQL und der auto-increment-Funktion abhängig zu sein,
> möchte ich meine IDs neuer Sätze nun über Sequenzen verwalten, was mit
> $db->createSequence und $db->newId() gut klappt.
> Das einzige was mich stört ist, dass für jede Tabelle eine eigene
> Sequenztabelle erstellt wird, was die Übersichtlichkeit im Datenbanktool
> bei ca. 20 betroffenen Tabellen doch etwas verringert.
> Gibt es zufällig eine Möglichkeit, dass z.B. Sequenzen verschiedener
> Tabellen in EINER Sequenztabelle verwaltet werden?
>
Nicht bei MySQL, da MySQL keine Sequenzen im herkömmlichen Sinn
versteht.
Wenn Du einfache Integer verwendest, könnte Dir da Auto-Increment von
MySQL weiterhelfen, ansonsten mußt Du, wenn Du bei MySQL bleiben willst,
wohl mit diesem Manko leben.
Oder steig um auf PostgreSQL ;-)
Gruss...
Der Indy
Re: Sequenzen auf MySQL mittels PEAR
am 11.02.2005 17:56:45 von Joerg Behrens
"Gerrit Beine" schrieb im Newsbeitrag
news:cuimfv$34n$1@jute.lausitz.net...
> Jens Riedel wrote:
> > Hallo,
> >
> > ich stelle gerade einige Anwendungen auf Datenbank-Kommunikation mittels
> > PEAR::DB um.
> > Um nicht von MySQL und der auto-increment-Funktion abhängig zu sein,
> > möchte ich meine IDs neuer Sätze nun über Sequenzen verwalten, was mit
> > $db->createSequence und $db->newId() gut klappt.
> > Das einzige was mich stört ist, dass für jede Tabelle eine eigene
> > Sequenztabelle erstellt wird, was die Übersichtlichkeit im Datenbanktool
> > bei ca. 20 betroffenen Tabellen doch etwas verringert.
> > Gibt es zufällig eine Möglichkeit, dass z.B. Sequenzen verschiedener
> > Tabellen in EINER Sequenztabelle verwaltet werden?
> >
> Nicht bei MySQL, da MySQL keine Sequenzen im herkömmlichen Sinn
> versteht.
> Wenn Du einfache Integer verwendest, könnte Dir da Auto-Increment von
> MySQL weiterhelfen, ansonsten mußt Du, wenn Du bei MySQL bleiben willst,
> wohl mit diesem Manko leben.
Die Anwort ging doch an der Frage vorbei oder?
PHPlib hat damals eine Sequenztabelle fuer alle Operationen benutzt. Wenn
man sich die Arbeitsweise anschaut entdeckt man ein Problem bei dem man evt.
beschliesst fuer gewollte Sequenzen eine seperate Tabelle zubenutzen. Fuer
das Anlegen einer Sequenz wird die Tabelle gesperrt. Wenn also mehrere
verschiedene Tabellen ihre ID haben moechten heist es erstmal warten. Evtl.
ist das der Grund warum Pear:DB seperate Tabellen hat.
Solltest du trotzdem einen Weg finden sag mal bescheid.
Gruss
Joerg
--
TakeNet GmbH Mobil: 0171/60 57 963
D-97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Straße 20 Fax: +49 931 903-3025
Re: Sequenzen auf MySQL mittels PEAR
am 11.02.2005 18:06:50 von Thomas Hamacher
Joerg Behrens schrieb:
> "Gerrit Beine" schrieb
>>Jens Riedel wrote:
>>>ich stelle gerade einige Anwendungen auf Datenbank-Kommunikation mittels
>>>PEAR::DB um.
>>>Gibt es zufällig eine Möglichkeit, dass z.B. Sequenzen verschiedener
>>>Tabellen in EINER Sequenztabelle verwaltet werden?
[...]
> Solltest du trotzdem einen Weg finden sag mal bescheid.
Die Klasse DB_mysql ableiten, die Methoden nextId(), createSequence(),
getSequenceName() und dropSequence() überschreiben und hoffen, das
nichts anderes daran beteiligt ist *g*.
Re: Sequenzen auf MySQL mittels PEAR
am 12.02.2005 00:13:10 von Axel Schwenke
Gerrit Beine wrote:
> Jens Riedel wrote:
>> Gibt es zufällig eine Möglichkeit, dass z.B. Sequenzen verschiedener
>> Tabellen in EINER Sequenztabelle verwaltet werden?
>>
> Nicht bei MySQL, da MySQL keine Sequenzen im herkömmlichen Sinn
> versteht.
> Wenn Du einfache Integer verwendest, könnte Dir da Auto-Increment von
> MySQL weiterhelfen, ansonsten mußt Du, wenn Du bei MySQL bleiben willst,
> wohl mit diesem Manko leben.
Was für ein Blödsinn.
> Oder steig um auf PostgreSQL ;-)
Kannst du noch ein anderes Lied?
Selbstverständlich kann man mit MySQL mehrere Sequenzen in einer
Tabelle verwalten. Eine halbwegs elegante Methode stellte dafür
die phplib bereit, die allerdings zum Inkrementieren einer Sequenz
die Sequenztabelle mal kurz gelockt hat. Mittlerweile geht das
noch eleganter:
CREATE TABLE sequence (
name CHAR(16) NOT NULL PRIMARY KEY,
value INT UNSIGNED NOT NULL DEFAULT 0
)
neue Sequenz anlegen:
INSERT INTO sequence (name, value) VALUES ("foo", 42);
INSERT INTO sequence (name) VALUES ("bar");
Sequenz inkrementieren:
UPDATE sequence SET value = LAST_INSERT_ID(value+1) WHERE name = "foo";
die erzeugte Sequenznummer kann man sich dann per LAST_INSERT_ID()
oder einen der Wrapper um mysql_insert_id() holen. Vollkommen ohne
manuelle Locks und trotzdem ohne race condition. Ab MySQL 4.1 kann
man Sequenzen auch automagisch erzeugen: INSERT INTO sequence (name)
VALUES ("foo") ON DUPLICATE KEY UPDATE ...
ABER
wenn man sich schon mal für PEAR::DB entschieden hat, sollte man auch
dessen Funktionalität nutzen.
XL