<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Abfrage für Datenbank erstellen]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Klasse, die eine Datenbank darstellt. In dieser werden Datensätze (Eigenschaften) zu Objekten gespeichert (z.B. Position, Name, Farbe, etc.) Von dieser abgeleitet gibt es konkrete Datenbanken, die unterschiedlich realisiert werden können (SQL, XML, im Speicher):</p>
<pre><code>class Datenbank {
public:
    std::vector&lt;Object&gt; getObjekte(Abfrage q) = 0;
};

class SQLDatenbank : public Datenbank {
public:
    std::vector&lt;Object&gt; getObjekte(Abfrage q)
};
</code></pre>
<p>Ich möchte dann eine Abfrage erstellen können um bestimme Objekte auszuwählen. Z.B.</p>
<ul>
<li>Alle Objekte mit der Eigenschaft Farbe</li>
<li>Alle Objekte im Umkreis von 5m um den Punkt (1,1,1)</li>
<li>Alle Objekte mit der Farbe blau</li>
</ul>
<p>Die einzelnen Abfragen sollten mit Und, Oder und Nicht verbunden werden können. Ich hatte die Idee die Abfragen durch Klassen darzustellen:</p>
<pre><code>class Abfrage {};
class ImUmkreis : public Abfrage {
public:
    ImUmkreis(float radius, float x, float y, float z);
};

class UndAbfrage : public Abfrage {
public:
    add(Abfrage q);
private
    std::vector&lt;Abfrage&gt; abfragen;
};

template &lt;class T&gt;
class HatEigenschaft : public Abfrage {
    typedef T eigenschaft_t;
};
</code></pre>
<p>um dann zu Laufzeit eine Abfrage aus einzelnen Teilen zusammenzubauen:</p>
<pre><code>main() {
    UndAbfrage und;
    und.add(HatEigenschaft&lt;Position&gt;());
    und.add(ImUmkreis(5, 1, 1, 1));

    SQLDatenbank data;
    std::vector&lt;Objekte&gt; obj = data.getObjekte(und);
}
</code></pre>
<p>Um eine konkrete Datenbank diese Abfrage ausführen zu lassen wollte ich für jede konkrete Datenbank einen Visitor erstellen, der z.B. bei einer SQL-Datenbank einen Abfrage-String erstellt oder bei einer Datenbank im Speicher alle Objekte durchgeht und prüft ob die Abfrage wahr/falsch ist.<br />
Nur müsste ich die Basis-Visitor-Klasse jedesmal erweitern, wenn ich einen neuen Abfrage-Typ erstelle. Am liebsten wäre es mir, wenn ich nur eine neue Abfrage-Klasse erstellen müsste und Code für die konkreten Datenbanken.</p>
<p>Vielleicht wisst ihr auch eine besseren Ansatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300544/abfrage-für-datenbank-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 18:28:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300544.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Mar 2012 11:42:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abfrage für Datenbank erstellen on Mon, 05 Mar 2012 11:42:37 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Klasse, die eine Datenbank darstellt. In dieser werden Datensätze (Eigenschaften) zu Objekten gespeichert (z.B. Position, Name, Farbe, etc.) Von dieser abgeleitet gibt es konkrete Datenbanken, die unterschiedlich realisiert werden können (SQL, XML, im Speicher):</p>
<pre><code>class Datenbank {
public:
    std::vector&lt;Object&gt; getObjekte(Abfrage q) = 0;
};

class SQLDatenbank : public Datenbank {
public:
    std::vector&lt;Object&gt; getObjekte(Abfrage q)
};
</code></pre>
<p>Ich möchte dann eine Abfrage erstellen können um bestimme Objekte auszuwählen. Z.B.</p>
<ul>
<li>Alle Objekte mit der Eigenschaft Farbe</li>
<li>Alle Objekte im Umkreis von 5m um den Punkt (1,1,1)</li>
<li>Alle Objekte mit der Farbe blau</li>
</ul>
<p>Die einzelnen Abfragen sollten mit Und, Oder und Nicht verbunden werden können. Ich hatte die Idee die Abfragen durch Klassen darzustellen:</p>
<pre><code>class Abfrage {};
class ImUmkreis : public Abfrage {
public:
    ImUmkreis(float radius, float x, float y, float z);
};

class UndAbfrage : public Abfrage {
public:
    add(Abfrage q);
private
    std::vector&lt;Abfrage&gt; abfragen;
};

template &lt;class T&gt;
class HatEigenschaft : public Abfrage {
    typedef T eigenschaft_t;
};
</code></pre>
<p>um dann zu Laufzeit eine Abfrage aus einzelnen Teilen zusammenzubauen:</p>
<pre><code>main() {
    UndAbfrage und;
    und.add(HatEigenschaft&lt;Position&gt;());
    und.add(ImUmkreis(5, 1, 1, 1));

    SQLDatenbank data;
    std::vector&lt;Objekte&gt; obj = data.getObjekte(und);
}
</code></pre>
<p>Um eine konkrete Datenbank diese Abfrage ausführen zu lassen wollte ich für jede konkrete Datenbank einen Visitor erstellen, der z.B. bei einer SQL-Datenbank einen Abfrage-String erstellt oder bei einer Datenbank im Speicher alle Objekte durchgeht und prüft ob die Abfrage wahr/falsch ist.<br />
Nur müsste ich die Basis-Visitor-Klasse jedesmal erweitern, wenn ich einen neuen Abfrage-Typ erstelle. Am liebsten wäre es mir, wenn ich nur eine neue Abfrage-Klasse erstellen müsste und Code für die konkreten Datenbanken.</p>
<p>Vielleicht wisst ihr auch eine besseren Ansatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2188698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2188698</guid><dc:creator><![CDATA[NomAnor]]></dc:creator><pubDate>Mon, 05 Mar 2012 11:42:37 GMT</pubDate></item><item><title><![CDATA[Reply to Abfrage für Datenbank erstellen on Mon, 05 Mar 2012 12:20:55 GMT]]></title><description><![CDATA[<p>was in Richtung Linq?</p>
<p>als Beispiel/Ansatz: <a href="http://code.google.com/p/boolinq/" rel="nofollow">http://code.google.com/p/boolinq/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2188719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2188719</guid><dc:creator><![CDATA[__cu]]></dc:creator><pubDate>Mon, 05 Mar 2012 12:20:55 GMT</pubDate></item></channel></rss>