Wie am besten: Varabler Anzahl von Email headern in DB speichern

Hallo zusammen,

ich möchte von einkommenden Emails alle Header mit zugehörigem Value in einer PG 8.3.10 Speichern.

Bisher mache ich das mit einem Array:

CREATE SEQUENCE emails_eid_seq;
CREATE TABLE emails (
eid bigint DEFAULT nextval(‘emails_eid_seq’) PRIMARY KEY,
headers text[][],
eidtime timestamp with time zone DEFAULT now()
);

Problem ist nun das Suchen/Gruppieren der Emails da die Header generell unterschiedlich sind in der Anzahl und dem key.

(Also Anwendungsbeispiel ist das alle Emails mit der gleichen value in den headern user-agent und xwapprofile groupiert werden sollen)

Wie kann man das besser machen ?

Was mir so einfällt (aber wäre denke ich schon echt kompliziert)

Es gibt eine Tabelle emails die quasi nur die sequence enthält.

dann gibt es für jeden header eine eigene tabelle mit der email sequence als FK und der value.

also eine tabelle emails, eine tabelle header_useragent, eine tabelle header_xwapprofile

allerdings könnten das so bis zu 2000 tabellen werden (emailheader sind ja so kreativ)

Über Vorschläge wäre ich sehr dankbar

Warum nicht einfach Key, Value, Position? Im Key steht der Header, im Value der Wert und die Position ist eine fortlaufende Nummer, die mit “1” beim ersten Header anfängt.

Ach so, achte da drauf, dass es ein “From:” und ein “From” gibt :wink:

Warum machst du nicht pro Header einen Datensatz in der gleichen Tabelle?
create table mails(eid bigserial not null primary key, eidtime timestamp with time zone default now());
create table header(eid bigint not null references mails(eid), header_key text, header_value text);

Ganz, ganz schlechte Idee, weil das nicht skaliert: bei jedem neuen Header hast Du Dein Tabellen-Design anzupassen, ganz böse. Die besseren Lösungen hast Du ja schon genannt bekommen.

Andreas

Manomann manchmal ists das ei des Kolumbus ^^ Ihr habt recht. Denke als ich gesehen habe das es in pg arrays gibt bin ich da einfach ausgeflippt :wink:

Die position des headers wie es in der email gewesen ist ist unrelevant, sonst würde ichs machen wie ads es geschrieben hat. So reicht es wenn ich folgendes mache: ich löse das arrays feld in emails auf und mache die header table mit key, value, eid(FK)

Vielen Dank euch

Die Position des Headers ist nicht unrelevant. Ansonsten kannst du z. B. die Received Header, die in der Regel mehrfach vorkommen, nicht mehr eindeutig einordnen.
Andere Beispiele, die auf die Reihenfolge aufbauen, fallen dir sicher auch noch ein.

Nun, die Received-Header enthalten (oder sollten dies zumindest) einen Timestamp, mit dessen Hilfe man das natürlich noch nachvollziehen kann, aber Dein Einwand ist berechtigt.

Andreas

Der Timestamp ist allerdings ein extern erzeugtes Datum. Warum sonst gibt es Spamfilter, die bei zu großen Abweichungen zuschlagen? :wink:
Das sollte man also nicht als Sortierkriterium heranziehen.

Weitere Beispiele: Einträge von Virenscannern oder Domain-Key Signaturen.

Generell ist es nützlich zu wissen, in welcher Reihenfolge die Header in der E-Mail standen.