online 1
gast (50)

/ Forum / Skripte(PHP,ASP,Perl...)

Skripte(PHP,ASP,Perl...)Skripte(PHP,ASP,Perl...)

Fragevon DanielHatneFrage vom 05.10.2021, 09:28 Options

MySQL: Eine große Tabelle oder mehrere kleine?

Hallo,

der Betreff sagt es ja schon grundsätzlich, was meine Frage ist. Ich bin grad dabei, ein Mailsoftware zu schreiben, wobei es unterschiedliche Verteiler geben soll, d.h. ein Empfänger kann in mehreren Verteilern gleichzeitig mit der selben E-Mail-Adresse vorhanden sein. Es gibt ca. 30 Spalten von Anrede, Vorname, Nachname über die Adresse bis zu 10 individuellen Feldern.

Für mich stellt sich jetzt folgenden Frage: Ausgehend von der Annahme dass die Datenbank MySQL ist und ich erwarte, dass es pro Verteiler bis zu 1 Mio. Datensätze geben kann, macht es Sinn, für jeden Verteiler eine eigene Tabelle anlegen zu lassen (über die PHP-Oberfläche) oder sollten "gleiche Daten" (die Struktur ist ja exakt die selbe) auch in einer Tabelle bleiben? Was meint ihr? Grundsätzlich tendiere ich zu der 1-Tabellen-Version, allerdings bin ich skeptisch was die Größe angeht...

Ich hoffe ihr könnt mir Tipps geben oder Denkanstöße. Vielleicht hat ja jemand von euch schon mal ähnlich große Projekte gemacht...

Vielen Dank und Gruß
Daniel


Antwort schreiben

Antwort 1 von son_quatsch vom 05.10.2021, 10:02 Options

Um es einfach zu machen, nimm ausschließlich eine Tabelle. In einer Spalte kannst du die jeweilige Verteiler-Kennzeichnung eintragen und somit auch alle unterscheiden.

Um es effizient zu gestalten, müsstest du das detaillierter betrachten. Dazu würde ich folgende Tabellen erstellen:

  • Inhaber: ID (fortlaufend), Anrede, Vorname, Nachname, Adresse, weitere Felder
  • E-Mail-Adresse: ID (fortlaufend), E-Mail-Adresse, Kennzeichen
  • Verteiler: ID (fortlaufend), Bezeichnung, Rückadresse
  • Verteiler - E-Mail: ID_Verteiler, ID_E-Mail-Adresse


Zur Erklärung: in "Inhaber" werden alle Infos zur Person gespeichert. Da eine Person mehrere E-Mail-Adressen haben kann, werden diese Infos nicht mehrfach gespeichert.

"E-Mail-Adresse": Ein Inhaber kann mehrere E-Mail-Adressen haben. Die Spalte "Kennzeichen" kann für alle möglichen Zwecke dienlich sein, z.B. wie oft zu dieser E-Mail-Adresse eine Fehlerantwort kam, ob diese gerade im Urlaub ist etc...

"Verteiler" ist die Zuordnung aller Verteilerlisten zu einem definierten Namen.

Ein Verteiler kann mehrere E-Mail-Adressen haben - aber eine E-Mail-Adresse kann auch in mehreren Verteilern enthalten sein. Daher ist noch die Tabelle "Verteiler - E-Mail-Adresse" vonnöten.

Antwort 2 von DanielHatneFrage vom 05.10.2021, 11:02 Options

Also um der Einfachheit halber geht es mir gar nicht so sehr. Mit der Umsetzung würde ich keine Probleme haben. Und das Datenbankschema welches du vorgeschlagen hast, hätte ich auch so ähnlich umgesetzt. Mir gehts einfach nur darum, ob man nicht mit einer Tabelle pro Verteiler die Effizienz noch weiter steigern kann?

Antwort 3 von son_quatsch vom 05.10.2021, 11:19 Options

Nein.

Das läuft sogar entgegengesetzt zur Effizienz. Wenn du später in dem Programm die einzelnen Verteiler durchlaufen willst, müsstest du jede Tabelle davon separat ansprechen - das bedeutet: du musst jede beim Namen kennen und darüberhinaus auch wieviele davon existieren.

Das macht ausschließlich aus Übersichtlichkeitsgründen Sinn.

Antwort 4 von DanielHatneFrage vom 05.10.2021, 11:37 Options

Hm ok, aber wenn ich davon ausgehe, dass ich immer nur die Datensätze aus genau einem Verteiler genau anspreche, sollte das doch schneller sein, als wenn ich aus einer großen Tabelle erst (meinetwegen auch mit Index) die entsprechenden Datensätze heraussuchen muss!

Mal ein Beispiel:
ich starte einen Mailversand an Verteiler 1. Dabei soll jede Mail natürlich individuell sein, d.h. als Anrede steht etwa "Hallo Vorname Nachname!" usw drin. Wenn der Datensatz jetzt mit allen Informationen genau in der Verteiler-1-Tabelle steht, müsste das doch schneller sein als wenn ich erst über die Verteiler-E-Mail-Tabelle gehe, hier alle E-Mails aus Verteiler 1 selektiere, dann über Joins die entsprechenden Daten aus der Inhaber- und E-Mail-Tabelle holen muss. Oder liege ich da falsch?

Antwort 5 von son_quatsch vom 05.10.2021, 11:46 Options

Im grunde ja (du liegst falsch).

MySQL definiert für jede Primary Key -Spalte automatisch einen Index. Der Zugriff auf Datensätze über einen Index ist der schnellste überhaupt und exakt dasselbe wie das Auflisten aller Datensätze einer Tabelle ohne Index.

Ob du sämtliche Inhaberinfos mit in eine Tabelle zusammen mit E-Mail-Adresse kippst bleibt dir überlassen. Sollte sich einmal eine Info dafür ändern, wird es allerdings schwierig alle Datensätze (sprich E-Mail-Adressen) dieser Person zu ermitteln, da sie dann keine ID (eindeutige Nummer) mehr hat. Wenn du "Peter Meier" ändern sollst, wäre es fatal, wenn du alle Datensätze änderst, bei denen Vorname "Peter" und Nachname "Meier" ist (das wären mit Sicherheit mehr).


Alle Spalten einer Tabelle, die du in Abfragen verknüpfst (oder die du häufig in einem WHERE-Kriterium verwendest) sollten einen Index haben.

Antwort 6 von DanielHatneFrage vom 05.10.2021, 11:54 Options

Also erstmal danke für die super Antworten!

Jetzt ist nur die Frage, ob es keine Probleme gibt mit der Menge der Datensätze? Hab mal gehört, dass MySQL dafür nicht so gut geeignet sein soll?

Antwort 7 von son_quatsch vom 05.10.2021, 12:02 Options

Das weiß ich nicht. Allerdings bleibt MySQL oft als einzige Wahl übrig, wenn es um Kompatibilität und Verbreitung geht und wenn es kostenlos eingesetzt werden soll. Die Diva der DBMSe ist dann nachwievor Oracle - und das kostet.

Antwort 8 von son_quatsch vom 05.10.2021, 12:04 Options

Kompatibilität = kann mein Programm vollständig auf die Datenbank zugreifen oder ergeben sich Einschränkungen?

Verbreitung = finde ich im Internet genug Hilfe zu dieser Art? Wie groß ist die Community? Anzahl Beispiele?

Antwort 9 von DanielHatneFrage vom 05.10.2021, 16:47 Options

Ok. vielen Dank für die Infos, ich werd mir das mal alles genau durchdenken!

Antwort 10 von Hoehrn vom 05.10.2021, 16:53 Options

Bei einer großen Tabelle für alles musst du bei Änderungen, zum Beispiel des verteilers, die ganze große Tabelle ändern, such mal schön....

Antwort 11 von DanielHatneFrage vom 06.10.2021, 10:04 Options

Hallo Hoehrn,

ich glaub du hast meine Frage überhaupt nicht verstanden...macht aber nix. Ich hab es schon mit Hilfe von son_quatsch gelöst.

Ähnliche Themen

MySQL Datumsabfrage
MichaelV1971  18.08.2008 - 24 Hits - 1 Antwort

MySQL installieren
TByte  18.10.2008 - 35 Hits - 13 Antworten

MySQL Integer Wert in Tabelle INSERT
TByte  14.03.2009 - 327 Hits - 1 Antwort

MySQL Arrays
TByte  14.06.2009 - 547 Hits - 8 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026