next up previous contents


3.13 Grenzen von MySQL?

Betrachten wir die nachfolgende Ausgabe:

mysql> select akten.ID,akten.Titel,akten.Seiten,
    -> seiten.Text from akten,seiten where akten.ID=seiten.AkteID;
+----+------------------+--------+--------------------------------+
| ID | Titel            | Seiten | Text                           |
+----+------------------+--------+--------------------------------+
|  1 | Meine erste Akte |      0 | Ferien, Felsberg, Schweiz      |
|  1 | Meine erste Akte |      0 | Wir erfassen eine zweite Seite |
+----+------------------+--------+--------------------------------+
2 rows in set (0.01 sec)

Das Feld 'Seiten' der Tabelle 'akten' führt uns in die Irre, bestehen doch in der Tabelle 'seiten' bereits zwei Seiten für die erste Akte. Im Prinzip könnten wir immer über die Tabelle 'seiten' die aktuelle Anzahl der Seiten je Akte abfragen; und so würde es wohl auch im Lehrbuch stehen. Abfragen über mehrere Tabellen können aber bei umfangreichen Datenbeständen langsam werden. Damit dies später nicht auftritt, legen wir die Anzahl der verfügbaren Seiten direkt in der Tabelle 'akten' im Feld 'Seiten' ab. Allerdings handeln wir uns dabei das Problem ein, dass wir bei jedem Hinzufügen einer Seite in der Tabelle 'seiten' den Wert 'Seiten' in der Tabelle 'akten' anpassen müssen. Das würde letztlich in etwa so aussehen:

mysql> insert into seiten (AkteID,Seite,Text)
    -> values (1,3,'Jetzt haben wir die dritte Seite');
Query OK, 1 row affected (0.01 sec)

mysql> update akten set Seiten=3 where ID=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from akten;
+----------------------+---------------------+--------+----+----------------+
| Titel                | Datum               | Seiten | ID | DatumErfasst   |
+----------------------+---------------------+--------+----+----------------+
| Meine erste Akte     | 2003-05-28 00:00:00 |      3 |  1 | 20030526215835 |
| Akte mit Zeitstempel | 2003-05-28 00:00:00 |      0 |  3 | 20030526214942 |
+----------------------+---------------------+--------+----+----------------+
2 rows in set (0.01 sec)

Ob das Verfahren Sinn macht, darüber kann gestritten werden. Letztlich entspricht das Feld 'Seiten' in der Tabelle 'akten' genau dem gleichen Wert, wie wenn wir ihn direkt aus der Tabelle 'seiten' abfragen würden. Die meisten Datenbanksysteme bieten für solche Fälle Referenzierungen (references) an. MySQL bietet eine solche Option derzeit noch nicht an für die MyISAM-Tabellen (davon später mehr) und solange dies der Fall ist, ergibt die hier angeführte Lösung m.E. durchaus Sinn.



next up previous contents

Dokument als PDF anzeigen -- © 2003-06-15 by Urs Pfister, CH-8057 Zürich