DB was ist schneller

Terra2000

Mitglied
Hi

Ich möchte eine Kundendatenbank anlegen was ist da geschickter:

1.)
eine Tabelle mit allen daten der kunden

oder

2.)
zwei Tabellen
eine mit dem namen usw.
und
eine mit der bankverbindung usw.


Hoffe meine frage ist verständlich.

Es geht nicht nur um diese Tabelle sonder auch allgemein was schneller ist.

Abfrage läuft via PHP
DB ist MySql
 
Es gibt keine allgemeingültige Antwort auf "sind mehr kleine oder weniger grosse Tabellen schneller". Die Geschwindigkeit ist bei Lese- und Schreibzugriffen unterschiedlich, und dann kommts noch auf die Datenstruktur und die Datenmenge sowie auf die Indexierung an.

Grundsätzlich braucht ein Lesezugriff auf mehrere Tabellen eher mehr Zeit, weil das Zusammenführen der passenden Datensätze zusätzlichen Aufwand bedeutet. Es bringt aber nichts, deshalb viele nicht_logisch_zusammenhängende Daten in eine einzelne grosse Tabelle zu packen, vor allem wenn dabei Redundanzen (Mehrfach-Vorkommen von gleichen Werten) entstehen.

In Deinem Fall würd ich sagen, die Bankverbindung gehört genauso zum Kunden wie seine Adresse oder Telefonnummer, also in die gleiche Tabelle. Nur wenn ein Kunde mehrere Bankverbindungen haben kann, brauchts eine separate Tabelle für die Bankverbindungen.

Griessli
Irene
 
Zum Thema Datenbankdesign gibt es viele Infos im Internet und viel Literatur.

Hinsichtlich Performance solltest du die Strukturen so einfach wie möglich belassen. Denn Irene hat völlig Recht, je mehr Tabellen (und möglicherweise einzelne SQL-Abfragen), umso länger dauert es.

Es hängt auch sehr von der Verwendung der Datenbank ab. Ist sie für interne Zwecke? Dann genügen z.B. eine Rechnungs- und eine Lieferanschrift. Aber falls der Kunde selbst seine Adressdaten eintragen und verwalten können soll, ist eine Lösung wie bei Amazon oder Ebay besser: Beliebig viele Adressdaten pro Kunde, die je nach Bedarf und Aufenthaltsort zur Liefer- oder Rechnungsanschrift gemacht werden können.

Gruß,
SloMo
 
Danke für die Tips

Werde mir nochmal gründlich gedanken machen wie ich die DB aufbaue.

Die DB soll nicht nur interne sachen enthalten.

Kann man den verschiedenen Tabellen unterschiedliche Passwörter zuweisen ???
Oder brauch ich da 2 DB´s ???

Einige Daten sind nur intern der rest ist intern und extren.

 
QUOTE Es hängt auch sehr von der Verwendung der Datenbank ab. Ist sie für interne Zwecke? Dann genügen z.B. eine Rechnungs- und eine Lieferanschrift. Aber falls der Kunde selbst seine Adressdaten eintragen und verwalten können soll,



QUOTE Kann man den verschiedenen Tabellen unterschiedliche Passwörter zuweisen ???
Oder brauch ich da 2 DB´s ???

Einige Daten sind nur intern der rest ist intern und extren.


Slomo meinte sicherlich eher, dass man einem Kunden, der auf einer Webseite etwas einkaufen soll und die Seite nicht sehr oft nutzt, mehr Komfort bieten muss als eventuell einem Mitarbeiter, der täglich mit dem System arbeitet.

Es macht keinen Sinn, die Daten zugriffstechnisch auf intern und extern aufzuteilen (also zwei Datenbanken), da du sie dann nicht mehr gemeinsam verarbeiten kannst.


QUOTE Zum Thema Datenbankdesign gibt es viele Infos im Internet und viel Literatur.

Dem kann ich mir nur anschließen.
Du solltest dir wirklich erstmal die Grundlagen klar machen.
 
@Terra2000:
Grundsätzlich geht es bei einer Datenbank darum, Redundanzen zu verhindern (Gucksuhier Wikipedia Redundanz). Das heisst, das mehrfache Vorkommen derselben Informationen gilt es zu vermeiden, das hält die Datenbank schlank und schnell.

Da nun aber bei Kunden-Informationen kaum Daten doppelt vorkommen können, macht es auch nicht gross Sinn, die Kunden-Informationen auf mehrere Tabellen zu verteilen (mal abgesehen von PLZ und Wohnort).

Man würde also bsp. eine Tabelle "Kunden", über eine eindeutige ID pro Datensatz, 1:n mit einer Tabelle Rechnungen, die als Kundeninformation nur die ID aus der Tabelle "Kunden" enthält, verknüpfen. Das klingt auch logisch, weil ein Kunde zwar mehrere Rechnungen haben kann, aber eine Rechnung nur einem Kunden zugeordnet werden darf.

Man könnte aber die Tabelle "Kunden" n:1 mit einer Tabelle "Wohnort" verbinden. Dabei wäre in der Tabelle "Kunden" unter Wohort nur die ID des zugehörigen Datensatzes der Tabelle "Wohnort" zu finden. Auch das erscheint logisch, kann es doch in einer Ortschaft mehrere Kunden geben, aber jeder Kunde kann nur einen Wohnort haben.

In Deinem Beispiel mit der Bankverbindung wäre es durchaus eine Überlegung wert, eine Tabelle mit allen vorkommenden Finanz-Instituten anzulegen. Jedoch müsste die Kontonummer trotzdem in der Tabelle Kunden liegen, damit das Sinn macht. Ist auch logisch oder? Es können mehrere Kunden bei der UBS sein, aber jeder Kunde hat eine eigene Kontonummer.

Du siehst also, wenn Du eine Datenbank schön schnell haben willst, dann sorgst Du dafür, dass sie klein bleibt. Dies erreichst Du dadurch, dass möglichst wenig Informationen mehrfach vorhanden sind.

Hamlet
 
Hallo Terra,

bei relationalen Datenbanken sollten die Tabellen in der Regel der 3. Normalform genügen.


Schöne Grüße
Hans

Ach ja, Hamlet, Kundendatenbanken mit mehr als 50 (Kunden)Tabellen sind übrigens keine Seltenheit!
ohmy.gif
 
@Hans-Werner:
So technisch wollte ich eigentlich gar nicht werden, aber ist egal. Hier beginnts ja langsam spannend zu werden.
cool.gif


Ist schon klar, gewisse Überschneidungen in einer Datenbank lassen sich nicht vermeiden. Klar könnte man z.B. sogar die Telefonnummer eines Kunden auf mehrere Tabellen verteilen. Sehen wir uns doch mal an, wie eine Telefonnummer aussieht:

001 41 61 XXX XX XX

So würde man aus Übersee nach Basel telefonieren (Wobei die "X"-en eine handelsübliche Telefonnummer darstellen).
Wir hätten also eine Tabelle, die die Kontinente erfasst. Lasst mich nicht lügen, das wäre eine Tabelle mit meines Wissens 8 Datensätzen (ich weiss, dass es keine 8 Kontinente gibt, aber ich glaube zu wissen, dass es 8 Kontinent-Einwahlen gibt). Darin hätte ein Datensatz 3 Felder: ID, Kontinent, Einwahl. Für obiges Beispiel wäre das dann:
ID = 1
Kontinent = Europa
Einwahl = 01

Dann hätten wir eine Tabelle mit den Ländern, die so aussieht: ID, KontinentID, Land, Einwahl. Für obiges Beispiel:
ID = 41
KontinentID = 1 (muss ja mit der obigen Tabelle verknüpfbar sein)
Land = 41
Einwahl = 041

Nun kämen für jedes Land Tabellen mit den regionalen Einwahlen. Die sähen dann so aus: ID, Gebiet, Einwahl. Für obiges Beispiel:
Tabellenname = 41 (siehe LandID von oben) (Iss klar, jetzt machen wir auch noch für jedes Land eine eigene Tabelle für die regionalen Vorwahlen.)
ID = 7
Gebiet = Basel / Baselland
Einwahl = 061

Der Rest der Telefonnummer bliebe in der Kundendatenbank. Dort würde dann die Telefonnummer wie folgt aussehen:
Kontinent = 1
Land = 41
Gebiet = 7
Nummer = XXX XX XX

Die zugehörige SQL-Abfrage wäre dann etwa so:
"SELECT Nummer From Tabelle WHERE (Land = (INNER JOIN FROM ... und weiss der Geier"
... oder war das "SELECT Einwahl FROM Kontinente (INNER JOIN FROM Land (INNER Join etc. und haste nicht gesehen"?

Tja, da müsste ich jetzt selbst erst experimentieren, bevor ich hier Mist erzähle. So aus dem Kopf kriege ich das jetzt nicht fehlerfrei hingepinselt, aber man könnte das machen.
laugh.gif


Nur ob das noch Sinn macht ist die grosse Frage. Hierzu ist die Abhandlung von Simone Fühles-Ubach höchst interessant zu lesen. Frau Fühles-Ubach zeigt hier sehr deutlich und anschaulich auf, dass gewisse Unschärfen im Bestreben zur absoluten Redundanz unvermeidlich sind. Die Frau hat was drauf.
ohmy.gif


Was bringt uns das nun?
Ist ganz einfach:
Wir sehen uns an, wieviele Kunden wir verwalten und wie tief die Erfassung der Kundendaten gehen soll (Wenn wir CDs handeln brauchen wir die Blutgruppe nicht).
Dann macht es Sinn, bei 500 Kunden die Anrede in eine separate Tabelle zu legen, was uns sogar die Möglichkeiten an die Hand gibt, für Serienbriefe vorbereitete Anreden zu definieren.
Bei 5000 Kunden könnte man den Wohnort extrahieren.
Bei 50000 Kunden haben wir sicher auch spezifischere Kundendaten, die sich extrahieren liessen.

Das lässt sich natürlich nicht nur für Kunden anwenden, wir können auf die gleiche Weise auch Postkarten, Zuchthennen, Plastikschrumpfköpfe oder rostige Nägel erfassen. Massgebend ist nur, welche Eigenschaften uns wichtig erscheinen, welche Eigenschaften so oft vorhanden und katalogisierbar sind, dass sie eigene Tabellen rechtfertigen.

Naja Leute, lasst Euch nicht erschrecken. Spielt mit Datenbanken und lernt sie schätzen.
biggrin.gif


Hamlet
 
Danke für die ausfühlichen tips.

Bei der bankverbindung war aber noch zusätzlich die überlegung das ich die daten der kunden offt brauche jedoch die bankverbindungen nur selten.
Daher auch die frage ob es auch in diesem fall bei weniger als 50000 kunden sinn macht eine extra tabelle anzulegen.

Das projekt soll erstmal auf ca 5-10k Kunden ausgelegt sein *g*
Mehr darfs immer werden
biggrin.gif


Kenne mich ein wehnig in SQL aus also hab ich mich auch schlau gemacht was besser ist 3.te oder 5.te normalform jedoch sagt jeder was anderes daher wollte ich eure meinung dazu höhren.

Was brauche ich für einen Server um ca 500-1000k Kunden zu verwalten ???
Brauch ich da einen Gameserver ???
Gibt es da einen preiswerten anbieter ohne das ich für traffic zahlen muß ???
(Ist für ein anderes projekt mit viel php rechnerrei)
Bin mommentan bei einem billig anbieter und denke das da die Leistung nicht genügt.

P.s.: Ihr seit echt klasse.
Hier wird einem ja fast immer kompetent geholfen.
Danke

 
Also grundsätzlich solltest Du Dir natürlich schon mal einen guten Hoster suchen, der Dir auch eine stabile Performance bieten kann. Ist klar, oder? Es macht wenig Sinn, Kerosin in einen Rasenmäher zu füllen und dann zu glauben, man habe einen Düsenjet.

Wenn Du die Bankverbindungen nicht brauchst, rufst Du sie nicht auf, damit der Server weniger zu tun kriegt, so einfach ist das:
CODE SELECT * FROM MeineTabelle
holt eben alles ab, was drin steht in der Tabelle.

CODE SELECT MeinFeld1, MeinFeld2, MeinFeld3 FROM MeineTabelle
holt nur die Daten, die gerade benötigt werden.
Bei 50000 Datensätzen macht es durchaus Sinn, nicht faul zu sein (ich bin so einer
ph34r.gif
) und seine SQL-Statements präzise zu planen und eben keine Daten abzurufen, die gar nicht benötigt werden.

Hamlet
 
Thx
Wenn das reicht einfach die daten nicht abzufragen ist das ja klasse.
Mir wurde mal gesagt das die abfrage trotzdem langsamer währe wenn viele daten in der tabelle sind auch wenn diese nicht abgefragt werden.

Klar planung ist alles.

Kennt ihr eine guten anbieter der preiswert ist und keine traffic kostet ???
Hab bisher nur einen gefunden der "Preiswert" ist aber da zahle ich unmengen für traffic.
Währ für jeden tip dankbar (suche halt die eierlegendewollmilchsau *g*)

 
QUOTE (Terra2000 @ So 19.12.2004, 11:16)Wenn das reicht einfach die daten nicht abzufragen ist das ja klasse.
Mir wurde mal gesagt das die abfrage trotzdem langsamer währe wenn viele daten in der tabelle sind auch wenn diese nicht abgefragt werden.

Es hängt sehr davon ab, wie die Indizierung aussieht. Ob da jetzt jedesmal die selten benötigte Bankverbindung mit zurückgegeben wird, fällt absolut nicht ins Gewicht. Denn das Hauptproblem ist nicht die Daten auszulesen, sondern sie zu finden und zu sortieren.

Je feiner du die Strukturen und die Abfragen auslegst, desto schwieriger wird es sein, sie zu erweitern, zu pflegen und zu debuggen.

Noch etwas: Planung ist nicht alles... es haben sich schon zu viele Leute verplant. Was viel mehr zählt, ist die Erfahrung mit dem verwendeten Datenbanksystem und der Programmiersprache. Deswegen rate ich dir, zuerst mit einem kleinen Projekt anzufangen (das kann ja schon Teilaspekte der letztendlichen Aufgabe berühren). Dabei wirst du in viele Fettnäpfchen treten, die dir bei der Planung garnicht in den Sinn gekommen wären.

In der Doku jedes DBMS gibt es ganze Kapitel, die sich ausschließlich mit dem Thema Performance-Optimierung befassen. Das unterscheidet sich von DB zu DB sehr.

50.000 Einträge sind übrigens eher wenig. Da muss man nicht viel optimieren. Wie viele Benutzer werden gleichzeitig online sein? Wieviele Seitenaufrufe pro Sekunde erwartest du? Das sind IMHO die spannenden Fragen. Wenn es regelmäßig mehr als 2 Aufrufe pro Sekunde sind, solltest du gleich einen "Game-Server" (Dedicated Server) einplanen. Ansonsten genügt wohl auch ein professionelles Hosting-Paket auf einem Shared Server.

Gruß, SloMo
 
Zurück
Oben