[Postfixbuch-users] DB-Strukturen
Christian Boltz
postfixbuch at cboltz.de
Sa Nov 1 14:47:43 CET 2008
Hallo Stefan, hallo Leute,
Am Donnerstag, 30. Oktober 2008 schrieb Stefan Förster:
> BTW, ich entschuldige mich schonmal für die Zeilenlänge.
Kein Problem, nur kommt dabei ein "interessantes" Quoting raus. Daher
verzichte ich soweit möglich aufs Zitat der Tabellenstrukturen ;-)
Ich sollte außerdem vorwegschicken, dass ich durch die Datenbankstruktur
von Postfixadmin "vorbelastet" bin ;-) Von mir aus kannst Du Dir auch
mal die Datenbankstruktur von Postfixadmin ansehen - da das Ziel
(Domains, Mailboxen und Aliase verwalten) gleich ist, ist der
Unterschied nicht allzu groß.
> mailsystem=> \d virtual_mailbox_domains
Passt.
[Extra Tabelle mit Logindaten, Quota usw.]
Was ist der Grund, das nicht in der virtual_mailbox_maps-Tabelle zu
haben? Üblicherweise wirst Du sowieso eine 1:1-Zuordnung von Logindaten
und Mailboxen haben.
> Als Login wollte ich nicht die eMail-Adresse benutzen.
Geschmackssache - ein eigenens Feld für den Usernamen tut jedenfalls
nicht weh. Andererseits ist die Regel "Mailadresse = Benutzername" für
die User leicht zu merken ;-)
> Dazu dann die Mailboxen:
>
> mailsystem=> \d virtual_mailbox_maps
...
> domain | integer |
> login | integer |
> localpart | character varying(65) | not null
Die Aufsplittung von Localpart und Domain ist rein aus Sicht der
Datenbank-Normalisierung sinnvoll. In der Praxis (Indexnutzung,
Vereinfachung der Queries) kann es aber sinnvoll sein, die komplette
Mailadresse in einem Feld zu haben.
Oder man nutzt ein *zusätzliches* Feld, das die komplette Mailadresse
enthält - mit Triggern kann man sowas bequem aktuell halten.
> Table "public.virtual_mailbox_maps"
Gleicher Hinweis wie oben - führt zu einer "interessanten" Query.
Da ist sie ja schon:
> query = SELECT (SUBSTR(vum.login, 1, 1) || '/' || vum.login ||
> '/Maildir/') AS mail FROM virtual_mailbox_domains vmd LEFT JOIN
> virtual_mailbox_maps vmm ON (vmd.id = vmm.domain) LEFT JOIN
> virtual_user_maps vum ON (vmm.login = vum.id) WHERE vmm.localpart =
> '%u' AND vmd.name='%d' AND vum.active;
Es mag Geschmackssache sein, aber mir wäre diese Query etwas zu lang für
eine simple Mailbox-Abfrage.
> Soweit ist das alles ganz einfach, und es bleibt auch einfach, wenn
> man nur Aliasse von/zu Domains aus virtual_mailbox_domains zulassen
> will,
...
> mailsystem=> \d virtual_mailbox_aliases
...
> target | integer |
Und wie willst Du Weiterleitungen an externe Adressen umsetzen?
Der Einfachheit halber sollte die Zieladresse ein varchar-Feld sein, in
dem schlicht eine Mailadresse steht.
> Was hier fehlt ist ein Constraint, der überprüft, ob es den
> "localpart" in der Domain "target" schonmal gibt - hier nehme ich
> gerne Hilfe an.
Sobald ein Catchall ins Spiel kommt, _brauchst_ Du sogar einen Eintrag
für jede Mailbox in der Alias-Tabelle. Ansonsten geht alles an den
Catchall und die anderen Mailboxen bekommen ihre Mails nicht mehr.
> Das führt dann zu folgender Map in virtual_alias_maps:
...
Na gut, mit einer ausreichend langen Query kann man alles erschlagen *g*
Du verbaust Dir dadurch aber die Option, Mails an eine Mailbox
gleichzeitig auch an eine andere Adresse weiterzuleiten ;-)
> Arbeitet man mit virtual_alias_domains, wird es eklig.
Oh ja. Haben wir bei Postfixadmin auch schon gemerkt ;-)
> Die Tabelle
> für die Domains legt man analog zu virtual_mailbox_domains an (ein
> Constraint, wie ich überprüfen kann, daß eine Domain nicht in beiden
> Tabellen auftaucht, wäre schön),
Packe alle Domains in eine Tabelle ;-) und baue ein zusätzliches
Boolean-Feld für "ist eine Alias-Domain" ein.
Postfixadmin treibt Alias-Domains übrigens auf die Spitze - eine Domain
kann Alias-Domain sein, aber trotzdem noch abweichende Mailadressen
enthalten. (Nein, ich habe nicht gesagt, dass die zugehörige Query
schön ist ;-)
Um das Ganze nochmal zusammenzufassen:
- eine perfekte Datenbank mit möglichst vielen Fremdschlüsseln ist zwar
schön, aber nicht immer praxistauglich
- ein Blick auf die Datenbankstruktur von Postfixadmin (SVN-Version) und
die verwendeten Queries (siehe DOCUMENTATION/*) kann Dir die ein oder
andere Anregung geben (vielleicht auch mir - falls Dir also irgendwas
seltsam vorkommt, melde Dich)
- oft sind "Schattenspalten" praktisch, um eine bessere Indexnutzung
und/oder einfachere Queries zu bekommen. Hint: diese Spalten lassen
sich per Trigger füllen und aktuell halten.
- für alle Tabellen hat sich ein Feld zum temporären Deaktivieren einer
Domain/Mailbox/... bewährt (Spalte "active" in postfixadmin)
Gruß
Christian Boltz
--
Vermutlich initialisiert das BIOS die Hardware nur halb, und die andere
Hälfte hängt vom Wasserstand in der Pegnitz und der Mondphase ab.
[Stefan Seyfried in suse-laptop]
Mehr Informationen über die Mailingliste Postfixbuch-users