<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Der Informatikblog &#187; SQL</title>
	<atom:link href="http://www.informatik-blog.net/category/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.informatik-blog.net</link>
	<description>Informatik &#38; Co.</description>
	<lastBuildDate>Mon, 28 Jun 2010 19:43:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Fremdschlüssel</title>
		<link>http://www.informatik-blog.net/2009/01/26/fremdschluessel/</link>
		<comments>http://www.informatik-blog.net/2009/01/26/fremdschluessel/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 22:17:23 +0000</pubDate>
		<dc:creator>bleed_ch</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[beziehung]]></category>
		<category><![CDATA[fremdschlüssel]]></category>
		<category><![CDATA[relation]]></category>
		<category><![CDATA[verbindung]]></category>

		<guid isPermaLink="false">http://www.informatik-blog.net/?p=316</guid>
		<description><![CDATA[

Ein ganz wichtiges Kapitel, vorallem wenn es um die Planung eines etwas grösseren Projektes geht, ist das Thema Fremdschlüssel. Fremdschlüssel verbinden (meist tabellenübergreifend) Einträge.  Nehmen wir an, wir haben eine &#8220;Mitglieder&#8221;-Tabelle. Diese Tabelle besitzt die Spalten &#8220;id&#8221; und &#8220;name&#8221; wobei ersteres der Primärschlüssel ist:

Nun fügen wir eine weitere Tabelle namens &#8220;Tagebuch&#8221; hinzu. Sie beinhaltet [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ein ganz wichtiges Kapitel, vorallem wenn es um die Planung eines etwas grösseren Projektes geht, ist das Thema Fremdschlüssel. Fremdschlüssel verbinden (meist tabellenübergreifend) Einträge. <span id="more-316"></span> Nehmen wir an, wir haben eine &#8220;Mitglieder&#8221;-Tabelle. Diese Tabelle besitzt die Spalten &#8220;id&#8221; und &#8220;name&#8221; wobei ersteres der Primärschlüssel ist:</p>
<p><img class="alignnone size-full wp-image-357" title="dbd-eins" src="http://www.informatik-blog.net/wp-content/uploads/2009/01/dbd-eins.png" alt="dbd-eins" width="170" height="180" /></p>
<p>Nun fügen wir eine weitere Tabelle namens &#8220;Tagebuch&#8221; hinzu. Sie beinhaltet die Spalten &#8220;id&#8221;, &#8220;mitglied_id&#8221; und &#8220;eintrag&#8221;. Der Primärschlüssel ist &#8220;id&#8221; und auf &#8220;mitglied_id&#8221; liegt ein Index:</p>
<p><img class="alignnone size-full wp-image-358" title="dbd-zwei" src="http://www.informatik-blog.net/wp-content/uploads/2009/01/dbd-zwei.png" alt="dbd-zwei" width="170" height="180" /></p>
<p>Der Index ist (je nach DBS) optional aber dringend empfohlen, da es sonst (vorallem mit wachsender Anzahl an Daten) zu starken Geschwindigkeitseinbussen kommen kann. Wir befüllen also die erste Tabelle:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> Mitglieder <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">42</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'A. Merkel'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>und dann noch die zweite:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> Tagebuch <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> mitglied_id<span style="color: #66cc66;">,</span> eintrag<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">42</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'I am beautiful, no matter what they say...'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Damit es nicht zur Verwirrung kommt habe ich unserem Mitglied die &#8220;id&#8221; 42 gegeben. Doch was passiert wenn wir den Eintrag löschen? Nichts. Und genau das ist das Problem: Sobald wir das versuchen würden, müssten wir dafür sorgen dass in allen Untertabellen sämtliche Relationen aktualisiert werden. Da sowas aber je nach Umfang des Projektes sehr kompliziert enden kann, geben die Datenbanksysteme uns eine sehr nützliche Funktionalität:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> Tagebuch <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>mitglied_id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> Mitglieder<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE;</pre></div></div>

<p>Wir haben soeben erfolgreich einen Fremdschlüssel von &#8220;Tagebuch:mitglied_id&#8221; zu &#8220;Mitglied:id&#8221; definiert. Bildlich würde das ganze so aussehen:</p>
<p><img class="alignnone size-full wp-image-381" title="dbd-relation" src="http://www.informatik-blog.net/wp-content/uploads/2009/01/dbd-relation.png" alt="dbd-relation" width="440" height="180" /></p>
<p>Wenn wir jetzt unserem Mitglied eine neue &#8220;id&#8221; verpassen oder es komplett löschen, geschieht es seinen Tagebucheinträgen gleich. Ausserdem ist es jetzt nicht mehr möglich einen Eintrag mit ungültiger &#8220;mitglied_id&#8221; in das Tagebuch einzufügen.</p>
<p>Es gibt 5 Reaktionen bei Fremdschlüssel:</p>
<p>** <strong>NO ACTION</strong>, Verweigert die Änderung und löst ein Fehler aus.<br />
<strong>RESTRICT</strong>, Verweigert die Änderung und löst ein Fehler aus.<br />
<strong>CASCADE</strong>, Reagiert gleich wie sein Parent.<br />
<strong>SET DEFAULT</strong>, Setzt den Standardwert.<br />
<strong>SET NULL</strong>, Setzt NULL.</p>
<p>** Bei dieser Option ist eine verzögerte Überprüfung möglich um so einer Verletzung der Regel zuvorzukommen.</p>
<p>Information 1: Der Datentyp TEXT gehört nicht zum SQL-Standard. Deshalb wurde VARCHAR ohne Längenangabe verwendet.</p>
<p>Information 2: Das Datenbanksystem MySQL macht keinen Unterschied zwischen &#8220;NO ACTION&#8221; und &#8220;RESTRICT&#8221;.</p>
<p>Information 3: Unter MySQL sind Fremdschlüssel nur mit der Datenbankengine InnoDB möglich. Standard: MyISAM.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.informatik-blog.net/2009/01/26/fremdschluessel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQL Race-Conditions</title>
		<link>http://www.informatik-blog.net/2009/01/23/sql-race-conditions/</link>
		<comments>http://www.informatik-blog.net/2009/01/23/sql-race-conditions/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 11:23:31 +0000</pubDate>
		<dc:creator>bleed_ch</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[functional-index]]></category>
		<category><![CDATA[race-condition]]></category>
		<category><![CDATA[unique-constraint]]></category>

		<guid isPermaLink="false">http://www.informatik-blog.net/?p=162</guid>
		<description><![CDATA[

Jeder kennt es, keiner will es: Race-Conditions. Ein Benutzer registriert sich und versendet versehentlich zweimal hintereinander das gleiche Formular.  Wer jetzt zuerst zählt:

SELECT COUNT&#40;*&#41; AS total FROM tabelle WHERE mail = 'user@example.com';

und danach gleich einfügt:

INSERT INTO tabelle &#40;mail&#41; VALUES &#40;'user@example.com'&#41;;

läuft Gefahr Opfer einer Race-Condition zu werden.
Was ist das und was passiert genau?
Das ist eigentlich [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Jeder kennt es, keiner will es: Race-Conditions. Ein Benutzer registriert sich und versendet versehentlich zweimal hintereinander das gleiche Formular. <span id="more-162"></span> Wer jetzt zuerst zählt:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> total <span style="color: #993333; font-weight: bold;">FROM</span> tabelle <span style="color: #993333; font-weight: bold;">WHERE</span> mail <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'user@example.com'</span>;</pre></div></div>

<p>und danach gleich einfügt:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabelle <span style="color: #66cc66;">&#40;</span>mail<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'user@example.com'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>läuft Gefahr Opfer einer Race-Condition zu werden.</p>
<p><strong>Was ist das und was passiert genau?</strong></p>
<p>Das ist eigentlich ganz einfach erklärt. Wenn wir zweimal das gleiche Formular versenden, durchläuft der Server zweimal die gleiche Datei. Ist der zeitliche Unterschied zwischen den beiden Aufrufen genug klein, ergibt sich bei beiden bei der ersten Zählung 0 und es wird danach auch bei beiden eingefügt. Da Spalten wie &#8220;mail&#8221; aber üblicherweise einen &#8220;unique-constraint&#8221; oder eben einen &#8220;unique-functional-index&#8221; besitzen, kommt es zum schlimmsten: Der spätere der beiden Aufrufe schlägt fehl und wird mit einem Fehler quittiert: Der Datensatz ist bereits vorhanden.</p>
<p><strong>Aber abgebrochene Aufrufe werden vom Server ja auch abgebrochen?</strong></p>
<p>Mit den Standardeinstellungen schon. Oftmals entscheiden sich Programmierer aber dazu &#8220;ignore_user_abort&#8221; zu benutzen was ja auch seinen guten Grund hat. Beispiel Bilderupload: Dort wird üblicherweise ein SQL-Query versandt und danach die Datei im Dateisystem entsprechend untergebracht. (Das ganze geht auch umgekehrt) Wenn der Benutzer jetzt zwischen einer der beiden Aktionen seinen Aufruf abbricht, haben wir einen losen Datensatz in der Datenbank oder im Dateisystem. Die Integrität wäre verloren. Ein weiteres Beispiel wäre eine Tabelle in der alle Besuche eines Mitglieds bei einem anderen Mitglied gespeichert werden natürlich mit einem &#8220;unique-constraint&#8221; über from_id und dest_id:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">UPDATE</span> tabelle <span style="color: #993333; font-weight: bold;">SET</span> visited <span style="color: #66cc66;">=</span> NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">WHERE</span> from_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> dest_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span>;</pre></div></div>

<p>Wer sich jetzt nur auf die betroffenen Zeilen verlässt und danach gleich einfügt:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabelle <span style="color: #66cc66;">&#40;</span>from_id<span style="color: #66cc66;">,</span> dest_id<span style="color: #66cc66;">,</span> visited<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>hat wieder eine wunderschöne und noch viel wahrscheinlich eintreffendere Race-Condition erstellt. Bei diesem Beispiel reicht es sogar aus ein Mitglied, welches noch nie besucht wurde, zweimal schnell hintereinander (Doppelklick) zu besuchen was ja nun wirklich nicht realitätsfremd ist.</p>
<p><strong>Was kann ich dagegen tun?</strong></p>
<p>Das ist jetzt eben der trickreiche Teil des ganzen. Er nennt sich &#8220;INSERT INTO &#8230; SELECT&#8221; mit einem Subquery und sieht aus wie folgt:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabelle <span style="color: #66cc66;">&#40;</span>mail<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">'user@example.com'</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabelle <span style="color: #993333; font-weight: bold;">WHERE</span> mail <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'user@example.com'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;</pre></div></div>

<p>und für das zweite Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabelle <span style="color: #66cc66;">&#40;</span>from_id<span style="color: #66cc66;">,</span> dest_id<span style="color: #66cc66;">,</span> visited<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabelle <span style="color: #993333; font-weight: bold;">WHERE</span> from_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> dest_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;</pre></div></div>

<p>Das war es auch schon. Wenn wir jetzt noch sauberkeitshalber die betroffenen Zeilen abfragen, können wir eine schön formatierte Meldung über den (Miss-)Erfolg ausgeben.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.informatik-blog.net/2009/01/23/sql-race-conditions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aufgepasst: E-Mail</title>
		<link>http://www.informatik-blog.net/2009/01/22/aufgepasst-e-mail/</link>
		<comments>http://www.informatik-blog.net/2009/01/22/aufgepasst-e-mail/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 20:31:41 +0000</pubDate>
		<dc:creator>bleed_ch</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[functional-index]]></category>
		<category><![CDATA[lower]]></category>
		<category><![CDATA[strtolower]]></category>
		<category><![CDATA[trim]]></category>
		<category><![CDATA[unique-constraint]]></category>

		<guid isPermaLink="false">http://www.informatik-blog.net/?p=97</guid>
		<description><![CDATA[

Ein Projekt wird realisiert und dabei wird eines viel zu oft vergessen: Die richtige Handhabung der E-Mailadressen. Üblicherweise erstellt der Initiator des Projektes eine Tabelle mit der Spalte &#8220;mail&#8221;, setzt sie auf unique und gibt sich damit zufrieden.  Doch aufgepasst: Je nach Einstellungen des Datenbanksystems oder der Verbindung ist die unique-Spalte case-sensitive. Das bedeutet [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ein Projekt wird realisiert und dabei wird eines viel zu oft vergessen: Die richtige Handhabung der E-Mailadressen. Üblicherweise erstellt der Initiator des Projektes eine Tabelle mit der Spalte &#8220;mail&#8221;, setzt sie auf unique und gibt sich damit zufrieden. <span id="more-97"></span> Doch aufgepasst: Je nach Einstellungen des Datenbanksystems oder der Verbindung ist die unique-Spalte case-sensitive. Das bedeutet sie unterscheidet zwischen Gross- und Kleinschreibung. Dann wird es möglich, sich mit ein- und derselben E-Mailadresse mehrmals zu registrieren. Zum Beispiel:</p>
<p><strong>&#8220;user@example.com&#8221; und &#8220;User@example.com&#8221;</strong></p>
<p>Ausserdem entfernen die meisten MTAs überschüssige Leerzeichen am Anfang und am Ende der E-Mailadresse.  MTAs (Mail Transfer Agent) sind Programme, die nach dem Aufruf von mail() eine E-Mail im Hintergrund versenden. Ein Beispiel für diesen Fehler:</p>
<p><strong>&#8220;user@example.com&#8221; und &#8221; user@example.com&#8221;</strong></p>
<p>Für die Datenbank sind das nicht die gleichen Strings &#8211; für manche MTAs schon. Daraus ergibt sich, vorallem in Kombination beider Fehler, eine imense Anzahl an Möglichkeiten sich mit der gleichen E-Mailadresse zu registrieren.</p>
<p>Nun gibt es grundsätzlich 2 Varianten dem entgegenzutreten. Die erste wäre folgende Funktion:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> address<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mail</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$revised</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mail</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$revised</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bei diesem (durch PHP gesicherten) Beispiel muss einfach sichergestellt werden, dass die Funktion überall dort Verwendung findet wo eine E-Mailadresse entgegengenommen wird. Das zweite Beispiel wäre ein sogenannter &#8220;functional index&#8221; im DBS. Das sind Indizes die einer gewissen Regel (Funktion) obliegen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> name_vom_index <span style="color: #993333; font-weight: bold;">ON</span> tabelle<span style="color: #66cc66;">&#40;</span>lower<span style="color: #66cc66;">&#40;</span>trim<span style="color: #66cc66;">&#40;</span>spalte<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Ich bin mir nicht sicher ob MySQL letzteres unterstützt. PostgreSQL tut es zumindest.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.informatik-blog.net/2009/01/22/aufgepasst-e-mail/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
