3.8k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
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

11 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
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:

[list][*]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
[/list]

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.
0 Punkte
Beantwortet von
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?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
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.
0 Punkte
Beantwortet von
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?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
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.
0 Punkte
Beantwortet von
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?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
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.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
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?
0 Punkte
Beantwortet von
Ok. vielen Dank für die Infos, ich werd mir das mal alles genau durchdenken!
0 Punkte
Beantwortet von hoehrn Experte (3k Punkte)
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....
...