2009-03-09 11 views
8

Ich habe auf der Suche nach einer Antwort sowohl hier als auch auf Google gesucht, obwohl ich einige Hinweise gefunden habe, die ich nicht ganz gefunden habe eine Lösung.Beste Datenbankstruktur zum Speichern von RSS-Feeds

Wenn Sie einen einfachen RSS-Reader mit einer Datenbank haben, könnten Sie zum Speichern von Feeds ein paar Tabellen (ohne Berücksichtigung mit Abonnent zu tun hier):

  • Feeds (feed-ID, Futtermittel-Titel , feed-url)
  • Artikel (Artikel-ID, feed-ID, Artikel-Titel, Artikel-Inhalt)

Dies funktioniert in den meisten Fällen, aber für viele Websites/webbasierte Anwendungen haben Sie möglicherweise einen Haupt-Feed von der Startseite und dann Kategorie-Feeds, wenn Sie beide in die obige Art von System nehmen, wird es eine Menge replizierter Daten aufgrund sein Derselbe Beitrag erscheint in mehreren RSS-Feeds.

Die zwei Möglichkeiten, die ich gefunden habe, sind entweder ignorieren und akzeptieren die Duplikate oder verwenden Sie eine Verknüpfungstabelle zwischen den Feeds und den Elementen. Aber das scheint auch eine ziemliche Verschwendung zu sein, wenn wahrscheinlich 80% der Art von Feeds, die ich zu ziehen versuche, nicht mehrere Feeds haben, die diese Replikation erzeugen könnten.

Gibt es einen besseren Weg dies zu tun/schaue ich das völlig falsch an?

aktualisieren

Dank sowohl für die Antworten, so der Konsens, dass die Einsparung von Raum zu sein scheint wahrscheinlich nicht signifikant genug ist, um sich Sorgen zu machen und würde durch das Potential für unbekannte Probleme negiert werden (wie zum Beispiel von dbr erwähnt).

Das Hinzufügen einer Linktabelle oder ähnlichem würde wahrscheinlich auch die Verarbeitungszeit erhöhen, so dass es sich insgesamt nicht lohnt, sich zu viele Gedanken zu machen. Ich hatte Gedanken nach dem Lesen der Antworten der Verknüpfung von Inhalten und Entfernen von Duplikaten nur dann, wenn der Beitrag nicht mehr in RSS-Feeds ist, um Platz zu sparen, aber wie Assaf gesagt hat, könnte die Platzeinsparung dies eine Zeitverschwendung machen.

Antwort

3

Ich würde vorschlagen, dass Sie nicht versuchen, jede mögliche Kopie von Feed-Daten zu diesem Zeitpunkt der Entwicklung zu optimieren (Design, nehme ich an). Konzentrieren Sie sich darauf, es funktioniert und wenn Sie fertig sind, wenn Sie einige Profilerstellung und finden Sie, dass Sie tatsächlich X% des Speichers speichern können, wenn Sie Links oder freigegebene Daten zwischen Feeds verwenden, nur und wenn X ist groß genug, um für die Zeit zu bezahlen, die es dauern würde, um Ihre DB zu optimieren, würde ich vorschlagen, dass Sie solche fortgeschritteneren Schemata implementieren.

3

Wie Assaf sagte, würde ich mir keine Sorgen machen, duplizierte Artikel zu speichern, wenn sie aus verschiedenen Feeds kommen, zumindest jetzt. Die Komplikation, die es hinzufügen würde, nützt nicht den wenigen Kilobyte Raum, die Sie sparen würden.

Ich nehme an, wenn Sie einen sha1 Hash des Inhalts nehmen, tun Sie SELECT id FROM articles WHERE hash = $hash und wenn etwas existiert, haben Sie einfach eine "article_content_id" welche wenn der Artikel den Inhalt in einer anderen Zeile anzeigt ... aber was ist, wenn Sie zwei Artikel haben:

id: 1 
title: My First Post! 
feed: Bobs site 
content: Hi! 
hash: abc 
link: no 
content_link_id: 

id:2 
title: My First Post! 
feed: Planet Randompeople Aggregator 
content: 
hash: abc 
content_link_id: 1 

..das funktioniert gut, und Sie haben 3 Bytes gespeichert, indem Sie den Artikel nicht duplizierten (offensichtlich mehr, wenn der Artikel länger war)

..aber was passiert, wenn Bob beschließt, Anzeigen zu seinem RSS-Feed hinzuzufügen, den Inhalt von Hi! zu ändern zu Hi!<p><img src='...'></p> - aber Planet Randompeople streift alle Bilder aus. Um ein Feed-Element zu aktualisieren, müssen Sie dann jede Zeile überprüfen, die content_link_id -links für den Artikel, den Sie aktualisieren, überprüfen, ob das neue Element den gleichen Hash wie die Artikel hat, die es verknüpfen - wenn es anders ist, müssen Sie brechen der Link und kopieren Sie die alten Daten auf den Link-Artikel, dann kopieren Sie den neuen Inhalt auf den ursprünglichen Artikel ..

Es gibt möglicherweise sauberere Möglichkeiten, das zu tun, aber mein Punkt ist, dass es sehr kompliziert werden kann, und Sie werden speichern Sie wahrscheinlich nur ein paar Kilobytes (vorausgesetzt, die Datenbank-Engine macht keine Komprimierung selbst)

Ansonsten scheint eine Tabelle von feeds und items vernünftig, und ist, wie die meisten andere RSS-Speicher-Datenbanken, die ich habe gesehen behandelt es ..

Verwandte Themen