Design einer InnoDB ist mein Ansatz richtig?

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

Design einer InnoDB ist mein Ansatz richtig?

Postby tommyboy » 02. March 2005 09:03

Guten Morgen Community,

ich habe ein grudlegendes Problem! Ich überlege mir schon länger
wie ich meine DB struckturiere bzw. die Tabellen aufteile (designe).
Kleine Vorgeschichte ich möchte in meinem Programm die Versandkosten
berechnen, aber nur über das Gewicht. Also dachte ich ich mache

Eine 1.Tabelle Versandunternehmen diese hat einen primären
Index vunternehmen_id, beeinhaltet Felder für den Firmenname und die
Anschrift.

Eine 2. Tabelle Versandgewicht diese enthält den primären Index
gewicht_id und besitzt das Feld mit der Angabe des Gewichts.

Eine 3. Tabelle Versandkosten diese enthält den primären Index
vkosten_id und den foreign key vunternehmen_id der auf die
Tabelle Versandunternehmen referenziert und einen weiteren foreign key
gewicht_id der auf die Tabelle Versandgewicht referenziert.
Sie enthält noch das Feld Preis mit dem Preis für das spezielle Gewicht und
das spezielle Versandunternehmen.

Meine Fragen hierzu:

1.Ist diese Aufteilung in 3 Tabellen Sinnvoll?

->Ich dachte daran das sich das Gewicht wiederholt deswegen eine eigene Tabelle(Versandgewicht).
->Die Kosten sind für jedes Versandunternehmen unterschiedlich deswegen auch eine eigene Tabelle(Versandunternehmen).
->Kosten beeinhalten ein spezifisches Versandunternehmen und ein spezifisches Gewicht deswegen die Tabelle(Versandkosten)


2.Ist das benützen von InnoDB Sinnvoll?

-> Ich dachte es ist besser zwecks Datenkonsitens und dieses System erlaubt auch schnellere Zugriffe

3. Wenn ich ein Versandunternehmen lösche werden dann alle Versandkosten die auf dieses Versandunternehmen zeigen auch gelöscht?

:!: Würde mich freuen über eure Meinung zu meiner Aufteilung Pro und Conta!
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen

Postby Jan H. Krüger » 02. March 2005 09:43

Was ich nach einem kurzen Blick nicht ganz nachvollziehen kann ist die Tabelle Versandgewicht.
Wenn ich das richtig verstanden habe hast du zB folgende Einträge:
ID Gewicht
1000 1kg
1001 2kg
1002 5kg

Warum?

Wäre es da nicht einfacher das Gewicht und die Unternehmensid als zusammengesetzten Primärschlüssel zu nehmen und dann als drittes Feld die Kosten welche verursacht werden eine Sendung mit diesem Gewicht zu verschicken?

Also in etwa: Gewicht, Unternehmen, Preis
Wobei Unternehmen dann ein Fremdschlüssel ist und mit Gewicht den Primärschlüssel bildet.

Dann würde denke ich die dritte Tabelle nicht mehr benötigt werden.

Zu der Verwendung von InnoDB: kommt drauf an was du vorhast, wie die zu erwartende Auslastung der Datenbank sein wird etc.
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Re: Design einer InnoDB ist mein Ansatz richtig?

Postby Hanspeter Thöni » 02. March 2005 10:28

tommyboy wrote:2.Ist das benützen von InnoDB Sinnvoll?

-> Ich dachte es ist besser zwecks Datenkonsitens und dieses System erlaubt auch schnellere Zugriffe

3. Wenn ich ein Versandunternehmen lösche werden dann alle Versandkosten die auf dieses Versandunternehmen zeigen auch gelöscht?

:!: Würde mich freuen über eure Meinung zu meiner Aufteilung Pro und Conta!


2. Inno-DB bietet die Vorteile:
- Fremdschlüsselbeziehungen werden überprüft (Datenkonsistenz).
- Transaktionssicherung (für mich eigentlich der wichtigeste Punkt.) Wenn also eine Transaktion über mehrere Tabellen geht, kann hier sichergestellt werden, dass entweder alle oder keine Aenderungen geschrieben werden.
Erkauft werden diese Vorteile natürlich damit, dass Innodb weniger schnell ist, als myIsam, da mehr Überprüfungen, Zwischenspeicherung usw. erfolgen müssen.

3. Wenn du ein constraint (foreign key) definierst kann bestimmt werden, was beim Löschen des übergeordneten Satzes passieren soll. (on delete cascade oder on delete restrict). Bei Restrict lässt sich das Versandunternehmen einfach nicht löschen, solange noch untergeordnete Sätze exisiteren. Bei Cascade werden diese untergeordneten Sätze automatisch mitgelöscht. Es lässt sich allerdings darüber streiten, ob es grundsätzlich sinnvoll ist, das Löschen von Child-Sätzen der Datenbank zu überlassen, oder (auch aus Gründen der Nachvollziebarkeit des Codes) ob es nicht besser ist, in der Applikation zuerst die Child-Sätze zu löschen werden und dann erst den Master-Satz.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby tommyboy » 02. March 2005 10:28

Ja das hört sich logisch an! Also wenn ich dir recht folge meinst du das dann so:

Eine 1.Tabelle Versandunternehmen diese hat einen primären
Index vunternehmen_id, beeinhaltet Felder für den Firmenname und die
Anschrift.


Eine 2. Tabelle Versandkosten diese enthält den zusammengesetzten primären Index,
der sich aus (vunternehmen_id ,Gewicht)zusammensetzt.
Es gibt einen foreign key vunternehmen_id der auf die Tabelle Versandunternehmen referenziert. Ein Feld Gewicht und Preis.

InnoDB möchte ich so verwenden das wenn ich ein Versandunternehmen lösche, dass auch alle Preise in der Tabelle Versandkosten dieses Unternehmens gelöscht werden. Also alle Records wo diese gelöschte vunternehmens_id vorkommt.

Nun Fragen hierzu:

Wie kann ich mit phpMyAdmin einen zusammengesetzten Primärschlüssel erstellen?

Dauert die suche eines zusammgesetzten Primärschlüssels erheblich länger?

Wie sieht eine Query aus, wenn ich ein neues Versandunternehmen,Preis und Gewicht der Sendung abspeichern möchte?

Du hast mir wirklich weitergeholfen aber nun sind bei mir diese neuen Fragen aufgekommen!
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen

Postby Jan H. Krüger » 02. March 2005 11:58

Endresultat sollte dann sowas in der Art sein:
Code: Select all
CREATE TABLE `versandunternehmen` (
  `id_versandunternehmen` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate latin1_general_cs NOT NULL default '',
  `strasse` varchar(50) collate latin1_general_cs NOT NULL default '',
  `ort` varchar(50) collate latin1_general_cs NOT NULL default '',
  `plz` varchar(10) collate latin1_general_cs NOT NULL default '',
  PRIMARY KEY  (`id_versandunternehmen`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs AUTO_INCREMENT=1 ;


und

Code: Select all
CREATE TABLE `versandkosten` (
  `id_versandunternehmen` int(11) NOT NULL default '0',
  `gewicht` float NOT NULL default '0',
  `preis` float NOT NULL default '0',
  PRIMARY KEY  (`id_versandunternehmen`,`gewicht`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;


Zusammengesetzte Schlüssel kannst du mir PHPMyAdmin mit dem Unterprunkt " Indizes" bestimmen. Dort gibt es die Möglichkeit eine Index nicht nur über eine, sondern auch über n Tabellen anzulegen. Um den zusammengesetzten Schlüssel aus diesem Beispiel anzulegen dort einfach den alten Primary Key löschen, Index aus 2 Spalten anlegen, auf der nun ladenden Seite Primary Key auswählen, id_versandunternehmen und Gewicht auswählen und speichern.

EDIT:
So, hier nu die Befehle zum Einfügen.
Mit einem Insert in zwei Tabellen speichern ist ohne Views denke ich nicht zu bewerkstelligen, daher mit zwei Befehlen:

Code: Select all
INSERT INTO `versandunternehmen` ( `id_versandunternehmen` , `name` , `strasse` , `ort` , `plz` )
VALUES ('1000', 'Test', 'bla', 'blub', 'A-12345');
INSERT INTO `versandkosten` ( `id_versandunternehmen` , `gewicht` , `preis` )
VALUES ('1000', '1.2', '3.55');
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby tommyboy » 02. March 2005 15:12

Hallo Jan,

danke für deine Mühe ich habe mich erst jetzt melden können, da mein Monitor den Geist aufgegeben hat! Ich werde es gleich mal ausprobieren ob des alles klappt evtl. habe ich dann noch weitere Fragen.Ich hoffe ich nerve dich nicht.

Gruß und fettes Lob! :D

Tommyboy
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen

Postby tommyboy » 02. March 2005 15:41

Uppps fast hätte ich es vergessen, kann ich nun auch noch eine Referenz von der Versandkosten Tabelle zur Tabelle Versandunternehmen hinzufügen? Ist das Sinvoll oder würdest du das bleiben lassen?

Mfg
Tommyboy
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen

Postby Jan H. Krüger » 02. March 2005 16:04

Klar geht das.
Dafür gibt es den Punkt "Beziehungsübersicht".
Wenn man die Möglichkeit hat dann sollte man sie auch nutzen. Ansonsten würde ja mit einer der Hauptvorteile von InnoDB unegnutzt bleiben und wenn die Constraints auch anständig genutzt werden dann können sie das Leben sehr erleichtern.
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby tommyboy » 02. March 2005 16:14

Also ich habe nun unter Verweise folgendes eingestellt:

Interne Beziehungen:
Bei id_versandunternehmen habe ich versandkosten->id_versandunternehmen eingestellt.

InnoDB:
Dort habe ich versandunternehmen->id_versandunternehmen eingestellt.

Habe ich die so richtig verlinkt ?

Mfg
Tommyboy
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen

Postby Jan H. Krüger » 03. March 2005 08:15

Nein.
Geh mal in der Beziehugsübersicht auf das gelbe Ausrufungszeichen und warte kurz. Lies dir dann den erscheinenden Text durch, dann wird dir gesagt was von den beiden Einträgen überflüssig ist.
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby tommyboy » 03. March 2005 10:58

Also wenn ich keine referenz angebe, dann speichert meine Phpcode
das was ich möchte! Wenn ich aber eine Referenz von der Tabelle versandkosten zur tabelle versandunternehmen mache dann kommt eine Fehlermeldung!

Fehlermeldung:
Code: Select all
trigger_error("DB Error: constraint violation", "256") # line   27


Ich weis absolut nicht, was ich unter der Rubrik Beziehungsübersicht bei den beiden Tabellen (versandunternehmen und versandkosten) an den Parametern Interne Beziehungen (*) und InnoDB einstellen soll?????


Mfg
Tommyboy
Last edited by tommyboy on 03. March 2005 15:27, edited 1 time in total.
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen

Postby Jan H. Krüger » 03. March 2005 15:21

Image
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby tommyboy » 03. March 2005 16:19

Danke für den Screenshot!
Weil bei mir sieht des anderst aus!
Image

Was muß ich denn hier einstellen bzw. in der anderen Tabelle?

Mfg
Tommyboy
tommyboy
 
Posts: 71
Joined: 18. July 2004 10:44
Location: Stuttgart-Tübingen


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 1 guest