MySQL Gute Datenbankstruktur

DelphiKing

King with a crown
ID: 46719
L
20 April 2006
6.553
729
Heyho,

angenommen, ich will einen News-Artikel-Crawler schreiben, welcher ständig die 10 größten Newswebseiten durchforstet und dabei zu jedem Artikel möglichst viele Informationen speichern will.
Also beispielsweise den Titel, die Anzahl Kommentare, die User-Bewertung, wie oft die News angeschaut wurden und noch ein paar Sachen mehr.

Jetzt ist es aber so, dass diese 10 Webseiten die genannten Kriterien sehr unterschiedlich ausgestaltet haben, z.B. hat Webseite A bei den Bewertungen ein "Gefällt mir"-System, wo man nur sagen kann, dass einem ein Artikel gefällt.
Webseite B hat aber ein "Finde ich gut / Finde ich schlecht"-System und Webseite C hat 1-5 Sterne, die man vergeben kann. Und eine andere Seite hat vielleicht gar keine Bewertungen.

Wie erfasse ich diese Daten jetzt trotzdem möglichst ohne Informationsverlust in einer DB? So, dass ich zumindest die Artikel innerhalb einer Plattform untereinander vergleichen kann. Natürlich sollen, wenn neue Daten erfasst werden, die alten weiterhin gespeichert werden.
Natürlich sollte das auch flexibel sein, falls eine Webseite ihr Datenformat ändert oder eine neue Webseite dazukommt.

  • Für jede Newsseite eine eigene Tabelle, deren Spalten die jeweils verfügbaren Kriterien in der jeweiligen Ausprägung sind?
  • Oder für alle Newsseiten die gleiche Tabelle, aber alle möglichen benötigten Spalten drin, die dann eben u.U. leer sind?
  • Oder für alle die gleiche Tabelle und allgemein gehaltene Spalten, in denen die Werte dann plattformspezifisch z.B. XML-encodiert stehen?
  • Oder jeden einzelnen Wert für jede einzelne Webseite z.B. XML-encodiert in eine eigene Tabellenzeile und die Trennung dann scriptseitig ("SELECT wert WHERE newsseite=1 AND typ='bewertungen'")?

Oder vielleicht noch irgendwas anderes, was nicht unsauber oder unperformant ist? ^^

Wenn man halt mal wirklich davon ausgeht, dass es mehrere dieser Kriterien gibt, die von Plattform zu Plattform in sehr unterschiedlichem Format sind, und man sie trotzdem erfassen will…
Und natürlich die Frage "macht das alles Sinn / ist das erlaubt" mal völlig außen vor gelassen, geht ja nur um die technische Seite ^^


LG, flo
 
Wie erfasse ich diese Daten jetzt trotzdem möglichst ohne Informationsverlust in einer DB? So, dass ich zumindest die Artikel innerhalb einer Plattform untereinander vergleichen kann.
meinst du die Artikel einer Website vergleichen, oder Artikel von verschiedenen Webseiten? Denn Plattform ist hier in dem Kontext mehrdeutig.
Bei letzterem musst du die Daten bei dir eben in eine gemeinsame Struktur bringen, ist schwer, aber meist findet man doch ein System.

Für jede Newsseite eine eigene Tabelle, deren Spalten die jeweils verfügbaren Kriterien in der jeweiligen Ausprägung sind?
wirkt reichlich rendundant, denn die Eigenschaften die sich alle teilen (Titel, Text, Datum, Autor) haben ja eigentlich die gleiche Struktur.

Oder für alle Newsseiten die gleiche Tabelle, aber alle möglichen benötigten Spalten drin, die dann eben u.U. leer sind?
na das klingt aber gleich schon stark nach Verstößen der Normalform ;)

Oder für alle die gleiche Tabelle und allgemein gehaltene Spalten, in denen die Werte dann plattformspezifisch z.B. XML-encodiert stehen?
wtf?
Wenn du schon eine Datenbank nutzt, warum die Datenhaltung kaputt machen indem du wieder Daten speicherst, die für die Datenbank nicht auswertbar sind?

Oder jeden einzelnen Wert für jede einzelne Webseite z.B. XML-encodiert in eine eigene Tabellenzeile und die Trennung dann scriptseitig ("SELECT wert WHERE newsseite=1 AND typ='bewertungen'")?
wtf^2 :ugly:



Oder vielleicht noch irgendwas anderes, was nicht unsauber oder unperformant ist? ^^
Mir fallen da auf Anhieb 2 Methoden ein:
  • "Objektorientierung": erstelle eine Tabelle in der alle Einträge sind, die die gleiche Struktur haben, und dann für verschiedene Ausprägungen wie Bewertungen spezielle Tabellen
  • NoSQL: bei NoSQL hat man ja keine festen Schemas, das klingt für dein Problem geradezu optimal, leider hat MySQL das nicht. Digg (?) hatte das aber in MySQL nachgebaut, damit gab es nur noch eine Tabelle mit 2 Spalten: Key | Value
 
meinst du die Artikel einer Website vergleichen, oder Artikel von verschiedenen Webseiten? Denn Plattform ist hier in dem Kontext mehrdeutig.
Bei letzterem musst du die Daten bei dir eben in eine gemeinsame Struktur bringen, ist schwer, aber meist findet man doch ein System.
Ich meine ansich ersteres (Artikel nur webseitenweise vergleichen), aber eine gemeinsame Struktur wäre natürlich eigentlich sowieso wünschenswert. Ist aber halt schwer, weil man sowas wie "Like"s und Sterne-Bewertungen nicht vergleichen/vereinheitlichen kann…


All diese WTFs sind durchaus angebracht, weil du hast ja Recht… außer diesen "schmutzigen" Lösungen ist mir aber halt nix anderes eingefallen ^^
Hätte ich beim Gedanken daran kein Bauchweh, hätte ich gar nicht gefragt sondern implementiert und mich dann in 2 Monaten gewundert, wieso alles scheiße ist :ugly:

Mir fallen da auf Anhieb 2 Methoden ein:
  • "Objektorientierung": erstelle eine Tabelle in der alle Einträge sind, die die gleiche Struktur haben, und dann für verschiedene Ausprägungen wie Bewertungen spezielle Tabellen

  • Meinst du mit letzterem dann sowas wie eine Tabelle (mal ganz naiv) "5-Sterne-Bewertung" und eine Tabelle "Likes"?

    [*]NoSQL: bei NoSQL hat man ja keine festen Schemas, das klingt für dein Problem geradezu optimal, leider hat MySQL das nicht. Digg (?) hatte das aber in MySQL nachgebaut, damit gab es nur noch eine Tabelle mit 2 Spalten: Key | Value
Ich muss zugeben, ich habe mich mit NoSQL noch nicht im Detail befasst, drum kann ich mir das im Moment noch nicht so konkret vorstellen… theoretisch klingt das aber schon ganz interessant, muss ich wohl nur mal ein bisschen umdenken ^^


Danke also auf jeden Fall schon mal :)