XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   [MySQL] ab wann lieber eine neue Tabelle verwenden (http://xhtmlforum.de/showthread.php?t=35022)

The Doc 05.04.2005 18:51

[MySQL] ab wann lieber eine neue Tabelle verwenden
 
Ich schreib mir grad nen CMS und frag mich grad, ab wann man lieber eine neue MySql Tabelle verwenden sollte.
Es geht um folgendes:
Ich möchte z.B. einen Klickcounter und ein Voting schreiben, die optional in andere Scripte eingebunden werden können (z.B. Links, Downloads sowas).
Ich wollte eine Tabelle für Klicks, und eine für Votes nehmen, und dann über join und ein paar Parameter das ganze regeln, nur kam mir da die Frage, wann sowas eine - stark spürbare - Geschwindigkeits Bremse wäre, also ab wieviel Einträgen.
100? 500? 1000? 10.000?

s0nic 05.04.2005 19:39

Du solltest Dir Gedanken über Dein DB-Design machen, Stichwort 'Normalformen'. Damit solltest Du eine Struktur finden, die alle Anforderungen erfüllt. Die Menge der Einträge in einer Tabelle spielt dabei eine untergeordnete Rolle, denn DBMS (Datenbank Managementsysteme) sind darauf ausgelegt, sehr viele Daten zu speichern. 10.000 Einträge ist keineswegs viel für ein DBMS.

/€dit: Wenn Du Tabellen joinst, solltest Du aber auch drauf achten, kein Kreuzprodukt zu forcieren - denn dann wird es wirklich langsam.

Jan 05.04.2005 21:13

Hi!

Bei diesen Zahlen sehen ich wie mein Vorgänger auch keine Probleme. ;)
Du solltest dir aber gerade bei einem Join Geanken über ein vernünftiges INDEX-Design machen.

Alternativ könnte man auch z.B. für jeden Link eine Zeile hinterlegen, in dieser ein Feld mit den Klicks vorhanden ist, das entsprechend hochgesetzt wird. Wenn man aber noch andere Angaben speichern möchte wird das natürlich schwierig...

Gruß
Jan

The Doc 05.04.2005 22:33

Verstehe ich das richtig, eine Tabelle, für alles? Oder was meintest du mit "Normalformen"?
Und was meinst du mit "ein Kreuzprodukt forcieren"?

@ Jan
Ich wollte diese Scripte variabel einbinden, also es dem Endnutzer freistellen, sie zu benutzen. Jedes meiner Scripte hat eine MySql Tabelle mit primary ID (auto_increment). Als Index wollt ich daher
a)den Scriptnamen
b)die ID aus der Tabelle dieses Scripts
übergeben.

Sollte man es anders machen?

wahsaga 05.04.2005 23:12

Zitat:

Zitat von The Doc
Oder was meintest du mit "Normalformen"?

kuckst du hier: http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

s0nic 06.04.2005 00:27

Zitat:

Zitat von The Doc
Verstehe ich das richtig, eine Tabelle, für alles? Oder was meintest du mit "Normalformen"?

Nur eine Tabelle zu benutzen, wäre sehr wahrscheinlich gerade das Gegenteil von dem, was Du machen solltest. Was man unter den Normalformen versteht, kann man gut auf Wikipedia nachlesen - den Link hat wahsaga ja schon gepostet ;)

Zitat:

Zitat von The Doc
Und was meinst du mit "ein Kreuzprodukt forcieren"?

Wenn Du ein select durchführst und als Quelle 2 Tabellen angibst, dann wird ein Kreuzprodukt dieser beiden Tabellen erstellt, d.h. jede Zeile der einen Tabelle wird *allen* Zeilen der anderen Tabelle zugeordnet. Gibt es also in Tabelle A 10 Zeilen und in B 5 Zeilen, so wird Zeile 1 in A genau diese 5 Zeilen in B zugeordnet, so daß in der entstehenden Tabelle 5 Zeilen stehen. Genauso wird dann mit Zeile 2 Aus Tabelle A verfahren usw. Am Ende kommen also 50 Zeilen heraus. Nun stelle Dir 2 Tabellen mit jeweils ein paar tausend Einträgen vor...

Deshalb ist es sinnvoller, Join-Bedingungen anzugeben, z.B. soll der FK (Foreign Key/Fremdschlüssel) der einen Tabelle gleich dem PK (Primary Key/Primärschlüssel) der zweiten Tabelle sein. Die dabei entstehende Tabelle benutzt also die gegebene Bedingung als "Reißverschluß", um beide Ursprungstabellen miteinander zu verknüpfen. Das Resultat ist sehr viel kleiner.

Egal, wie man es macht - man kommt mit beiden Methoden zum Ziel. Gibt man jedoch keine Bedingung an, kann man evtl. ungewünschte Ergebnisse erhalten. Vor allem aber wird es dann viel langsamer.

The Doc 06.04.2005 17:35

Danke für den Link und die Tips, werd ich versuchen umzusetzen.

Frage zum Wikipost:
a) 2NF ist, was ich machen sollte, richtig?
b) Sobald man Date oder DateTime benutzt hat man keine 2NF (Date ist nicht atomar)
c) Würde das stimmen (Beispiel)

Tabelle 1
Text - Titel - Id - Tag - Monat - Jahr
Tabelle 2
FremdId - Kategorie - Id - Klicks

Jan 06.04.2005 21:55

Hi!

Ich würde das so machen:

Script-Tabelle:

id (Primärschlüssel) | script (Scriptname)

"Klick-Tabelle":

id (Primärschlüssel) | script_id (id aus der Script-Tabelle) | timestamp | user | u.s.w.

Dann würde ich in der Klick-Tabelle einen INDEX auf script_id
setzten. So kannst du die Tabellen wunderbar verknüpfen.
Oder habe ich jetzt etwas falsch verstanden? ;)

Gruß
Jan

s0nic 06.04.2005 22:21

Zitat:

Zitat von The Doc
Frage zum Wikipost:
a) 2NF ist, was ich machen sollte, richtig?

Du sollst alle 3 NF machen. Es kann aber sein, daß Du unbewußt schon die 1. und 3. NF gemacht hast - dann brauchst Du nur noch die Verschläge für die 2.NF umzusetzen.

Zitat:

Zitat von The Doc
b) Sobald man Date oder DateTime benutzt hat man keine 2NF (Date ist nicht atomar)

Nein, das ist so nicht richtig. Wiue oben schon erwähnt, sind die NF nur Vorschläge. Da steht zwar drin, daß Werte atomar sein sollen, aber gerade am Beispiel eines Datums oder eines Preises sieht man doch nur zu gut, daß man es dabei nicht übertrieben sollte. Nach dem Motto: Normalisieren, bis nichts mehr geht, und danach wieder de-normalisieren, bis es sinnvoll ist. Ein Datum gliedert man normalerweise nicht weiter auf (kommt aber auch auf den Einsatzzweck an).

Zitat:

Zitat von The Doc
c) Würde das stimmen (Beispiel)

Tabelle 1
Text - Titel - Id - Tag - Monat - Jahr
Tabelle 2
FremdId - Kategorie - Id - Klicks

Naja anstatt "Tag - Monat - Jahr" dann eben "Datum"...ansonsten kann ich zwar einerseits keinen Fehler sehen, andererseits aber auch nicht so recht den Sinn. Was ist aus den im Eingangsposting erwähnten "Votes" geworden? Welche Tabelle ist nun wofür (Annahme: Tabelle2 => 'Klicks'-Tabelle, Tabelle1 => ???). Die spalte FremdID ist okay, aber ich hätte sie anders (=treffender) benannt...aber das ist ja nu Geschmackssache. Ansonsten steig ich da abern icht ganz durch...so, wie du es machst, gibts ne '1:n'-Beziehung zwischen Tabelle 1 und Tabelle 2. Das heißt also, daß es zu einem Eintrag in Tabelle 1 mehrere Einträge in Tabelle 2 geben kann, wo bei dann jeweils die Kategorie und (wahrscheinlich) die Klickzahl unterschiedlich ist. Waren das Deine Vorstellungen? Dann ist es wohl richtig...

P.S.: IDs würde ich an den Anfang der Tabellen setzen - wegen des Überblicks...

The Doc 06.04.2005 23:08

Tabelle 1 wäre z.B. eine der Tabellen für Artikel, News, Events, Links etc. (in diesem Falle hab ich einfach nur ein paar Grundspalten gewählt).
Tabelle 2 wäre dann die Tabelle für Klicks, könnte ich ja gleich mit Votes verknüpfen.

Jan, du hast das nicht verstanden, oder? Weil dein vorschlag macht in meinen Augen keinen sinn :oops:


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:15 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023