Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3408[/thread]

Beziehungen in MySQL definieren

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Heromaster
 2004-02-19 12:06
#31751 #31751
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Wie formuliere ich eine korrekte Beziehung zwischen Tabellen? Irgendwie sagt mir MySQL immer, das ich einen Fehler in meinen Statements habe, wenn ich folgendes erstellen will:
[sql]CREATE TABLE acl_groups (id SMALLINT(2) UNSIGNED AUTO_INCREMENT NOT NULL, group VARCHAR(30) NOT NULL, level SMALLINT(1) UNSIGNED NOT NULL, description VARCHAR(255), PRIMARY KEY(id) ), TYPE =INNODB;
CREATE TABLE acl_rights (id TINYINT(23) UNSIGNED AUTO_INCREMENT NOT NULL, path VARCHAR(255) NOT NULL BINARY, groupid SMALLINT(2) UNSIGNED NOT NULL, INDEX group_idx(groupid), PRIMARY KEY(id), CONSTRAINT groups_rights FOREIGN KEY group_idx REFERENCES acl_groups(id) ON DELETE CASCADE ON UPDATE CASCADE), TYPE =INNODB;[/sql]
edit: Der Fehler kommt immer im 2. Statement, jedoch schweigt sich MySQL aus, wo genau der Fehler liegt.\n\n

<!--EDIT|Heromaster|1077185366-->
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
renee
 2004-02-19 13:16
#31752 #31752
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Heromaster,19.02.2004, 11:06]Wie formuliere ich eine korrekte Beziehung zwischen Tabellen?[/quote]
[sql]CREATE TABLE acl_groups (
 id SMALLINT(2) UNSIGNED AUTO_INCREMENT NOT NULL,
 group VARCHAR(30) NOT NULL,
 level SMALLINT(1) UNSIGNED NOT NULL,
 description VARCHAR(255),
 PRIMARY KEY(id)
), TYPE =INNODB;

CREATE TABLE acl_rights (
 id TINYINT(23) UNSIGNED AUTO_INCREMENT NOT NULL,
 path VARCHAR(255) NOT NULL BINARY,
 groupid SMALLINT(2) UNSIGNED NOT NULL,
 INDEX group_idx(groupid),
 PRIMARY KEY(id),
 FOREIGN KEY (groupid) REFERENCES acl_groups(id) ON DELETE CASCADE ON UPDATE CASCADE
), TYPE =INNODB;[/sql]
gemäß den Beispielen auf http://www.mysql.de/doc/de/SEC428.html\n\n

<!--EDIT|renee|1077189447-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
eisbeer
 2004-02-19 13:38
#31753 #31753
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was hier anzumerken ist: Es nervt tierisch,
das man Tabelle zwar in Beziehungen setzten
kann, welche sich aber nicht auf SELECTs
auswirken. Also das die verknüpften Daten
aus multiblen Tabellen nicht automatisch
ausgelesen werden. Ist das bei MySQL bzw.
InnDB etwas geplant, das man in der Zukunft
nicht immer resourcenfressende INNER JOINS
nehmen muss ?
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
renee
 2004-02-19 13:51
#31754 #31754
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@eisbeer: Willst Du das wirklich, dass alle damit verbundenen Daten angezeigt werden?? Bei kleinen Datenbanken, die maximal 4 Tabellen haben mag das ja noch gehen, aber stell Dir mal größere Datenbanken vor. Das würde riesige Ausgaben erzeugen und das würde noch ressourcenfressender sein, weil Du dann häufiger die gesamten Tabellen ausgelesen bekommst. Ich arbeite häufiger mit Datenbanken mit ungefähr 10-12 Tabellen. Aber in den Abfragen muss ich meistens nur 2 oder 3 Tabellen verknüpfen... Da sind INNER JOINs besser als ein automatisches Verknüpfen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Heromaster
 2004-02-19 14:01
#31755 #31755
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
@renee: Bei Deinem Beispiel kommt folgender Fehler:
Quote
MySQL meldet:
MySQL meldet:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax.

Anhand des Beispiels aus der MySQL-Doku funktioniert es wunderbar, wenn ich nur eine Spalte angebe. Sobald ich jedoch mehrere Spalten anlegen möchte, kommt diese Fehlermeldung. Der Haken dabei ist, das ich im Nachhinein keine neuen Spalten definieren kann, da MySQL meldet, es könne die Beziehung nicht löschen. Bin irgendwie gerade planlos.

@eisbeer: Die Beziehungen zwischen den Tabellen sind ja nur dafür da, das die referentielle Integrität gewahrt wird, mehr nicht.
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Crian
 2004-02-19 15:45
#31756 #31756
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=eisbeer,19.02.2004, 12:38]Was hier anzumerken ist: Es nervt tierisch,
das man Tabelle zwar in Beziehungen setzten
kann, welche sich aber nicht auf SELECTs
auswirken. Also das die verknüpften Daten
aus multiblen Tabellen nicht automatisch
ausgelesen werden. Ist das bei MySQL bzw.
InnDB etwas geplant, das man in der Zukunft
nicht immer resourcenfressende INNER JOINS
nehmen muss ?[/quote]
Die Antwort darauf sind Views.

Ich weiß nicht, ob MySql Views unterstützt,
aber echte™ Datenbanken tun es.

Mit Views definierst Du quasi eine Sichtweise
auf bestimmte Daten. Wenn man seine Daten
gemäß Normalform XYZ aufbereitet, bekommt
man viele Tabellen, um keine redundanten Daten
vorzuhalten. Das ist auch sehr sinnvoll. Um
aber für das Abholen von Daten icht immer
wieder von außerhalb komlizierte Selects aufbauen
zu müssen, kann man das intern machen und
erhält eine Art Pseudotabelle, in die man nicht
schreiben, aber aus der man lesen kann und die
immer aktualisiert wird, wenn eine der Tabellen
aus der die Daten der View stammen, verändert
wird.\n\n

<!--EDIT|Crian|1077199449-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
eisbeer
 2004-02-19 15:51
#31757 #31757
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
@renee:

Nein, natürlich nicht. Man müsste es halt irgendwie definieren,
aus welchen verknüpften Tabellen welche Felder mitselected
werden sollen dachte ich. Nicht alle, das wäre natürlich ein
overkill.

@Crian:
So ähnlich dachte ich. Ich muss mich mal erkundigen, ob MySQL
das kann. Was meinst du denn mit
Quote
... echte&™ Datenbanken ...

? Welche würdest du mir denn empfehlen?
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
Heromaster
 2004-02-19 15:55
#31758 #31758
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Views werden in MySQL 5.0 das erste Mal zur Verfügung stehen. Der MS SQL Server 2000, Oracle und SAP können auf jeden Fall Views.
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Crian
 2004-02-19 15:55
#31759 #31759
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=eisbeer,19.02.2004, 14:51]So ähnlich dachte ich. Ich muss mich mal erkundigen, ob MySQL
das kann. Was meinst du denn mit
Quote
... echte? Datenbanken ...

? Welche würdest du mir denn empfehlen?[/quote]

Naja, ich hab bisher nur mit Oracle zu tun gehabt. Als ich mich früher mal nach MySql erkundigte, konnte es noch nichtmal Mehfachjoines, woraufhin ich mch damit nicht weiter auseinandergesetzt habe. Ich weiß aber, dass es die heute beherrscht und weiß gar nicht, was ihm eigentlich fehlt.

Das "echte" war ein kleiner ketzerischer Seitenhieb, nimm ruhig MySql. Wenn man aber sehr viele Daten hat und eine DB im produktiven Einsatz, würd ich Oracle was Performance angeht auf jeden Fall größeres Vertrauen entgegenbringen.

Da das aber alles Gerede aus dem Bauch heraus ist, ohne die aktuellen Daten zu kennne, kannst Du es auch gern ignorieren ;)

Ich schätze mal, dass MySql Views kennt, das Konzept ist nicht gerade neu.

[quote=eisbeer,19.02.2004, 14:51]Man müsste es halt irgendwie definieren,
aus welchen verknüpften Tabellen welche Felder mitselected
werden sollen dachte ich.[/quote]
Ganau, und das ist dann ein View. :-)

Im Grunde genommen ist ein View genau eine solche Definition. In den Oberflächen zur Datenbank (hat MySQL sowas?) kann man sich die "Views" auch ansehen (daher wohl auch der Name) und mit select * from VIENAME kann man die Daten auslesen (und natürlich mit where ... wie gewohnt auswählen).

So kann man etwa eine Kundentabelle (mit KID Anschrift, Name, ...), eine Herstellertabelle (mit HID und weiteren Informationen), eine Verkaufstabelle (mit VID, KID, HID und weiteren Informationen) haben und eine View, die alles drei zusammen in einer "Tabelle" - äh View - darstellt.\n\n

<!--EDIT|Crian|1077199519-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2004-02-19 16:08
#31760 #31760
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@crian: ob das konzept neu ist oder nicht spielt bei MySQL keine Rolle. MySQL kennt auch keine Subquerys wie z.B. Oracle (jedenfalls bis Version 4.1 nicht)!
Ob MySQL Views kennt oder nicht weiß ich aber auch nicht.

MySQL wird halt im nomalen Webgebrauch benutzt, auch wir in der Bioinformatik benutzen diese Datenbank (besser Datenbankmanagementsystem). Ich werde die Datenbanken aber voraussichtlich in den nächsten Monaten nach Oracle migrieren (wegen Performance und Sicherheit)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2004-02-19 12:06.