Suche die Datenbank die zu mir passt

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Suche die Datenbank die zu mir passt

Beitrag von Bebu » Mo Nov 30, 2009 12:07 pm

Weiß jetzt nicht so recht, ob dass das richtige Forum dafür ist, aber notfalls kann man ja verschieben ;)

Also ich noch unter Delphi programmiert habe, war ich eigentlich hauptsächlich mit Datenbanken am Arbeiten, z. B. für ein ganz einfaches Bibliotheksprogramm für die Schülerbibliothek. Es war sehr einfach gestrickt, aber damals habe ich hauptsächlich mit der Paradox Datenbank mit der Borland BDE gearbeitet.

So was ähnliches suche ich jetzt für C/C++. Welche Datenbank könnt ihr mir empfehlen, für eine Anwendung, die nur lokal auf einem Rechner liegt, also keine Webbasierung oder Zugriff über Netzwerk (Wenn die Möglichkeiten trotzdem vorhanden sind, nicht weiter schlimme müsste ich mich halt nichtmehr umstellen, wenn ich es doch mal brauchen sollte). Es müssen keine riesigen Datenmengen verwaltet werden und die Datenbankfelder sind vorher bekannt und müssen selten bis gar nicht dynamisch erweitert werden. Suchdurchläufe sind dagegen wieder recht häufig zu erwarten sowie die Verknüpfung von zwei voneinander abhängigen Datenbanken z. B. über Schlüsselpaare oder einfach nur ID Nummern. Also im Grunde eine mehrzeilige Liste (ob das der richtige Ausdruck dafür ist? :roll: )

Außerdem muss sie folgende Vorraussetzungen erfüllen:
Keine zusätzlich Software muss installiert werden, die Datenbank lässt sich vollständig ins Programm einbetten.
Sie soll nichts kosten, das Programm wird nicht gewinnbringend sein, am liebsten OpenSource.
Die Datenbank lässt sich im Rahmen der Programminstallation vollständig aus Programmcode erstellen um die Installationsdatei möglichst klein zu halten(Programm wird per Email versandt).

Kennt ihr etwas, was meinen Anforderungen entspricht?

Edit: Hab noch eine wichtige Anforderung vergessen: Sie muss plattformübergreifend funktionieren
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Suche die Datenbank die zu mir passt

Beitrag von Xin » Mo Nov 30, 2009 1:38 pm

Ich glaube SQLlite erfüllt Deine Anforderungen. Bin mir aber nicht sicher - da ich da auch noch nicht mit hantiert habe.
Könnte aber schonmal ein Google-Stichwort sein. ^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Suche die Datenbank die zu mir passt

Beitrag von Bebu » Mo Nov 30, 2009 2:57 pm

Danke Xin, das sieht doch schon mal sehr gut aus. Wieder was, wo ich mich reinlesen kann ^^
Aber auf den ersten Blick scheint es genau das zu sein, was ich suche. Mal sehen, wie leicht sich das ganze in ein Windowsprogramm integrieren lässt...
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Suche die Datenbank die zu mir passt

Beitrag von AnGaiNoR » Mo Nov 30, 2009 7:07 pm

XML ist ja eigentlich kein Datenbanksystem, aber eignet sich meiner Meinung auch um Daten darzustellen. Einfach einzubetten ist es allemale und Suchanfragen lassen sich per XQuery einfach gestalten. Ich ziehe das menschenlesbare XML eigentlich einer binär gespeicherten Datenbank vor (die man ja nur schwer per Hand aus der Datei rauslesen kann).
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Suche die Datenbank die zu mir passt

Beitrag von Xin » Mo Nov 30, 2009 7:26 pm

Bebu hat geschrieben:Danke Xin, das sieht doch schon mal sehr gut aus. Wieder was, wo ich mich reinlesen kann ^^
Aber auf den ersten Blick scheint es genau das zu sein, was ich suche. Mal sehen, wie leicht sich das ganze in ein Windowsprogramm integrieren lässt...
Wenn Du Dich einliest, kannst Du das ganze auch mal hier vorstellen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Suche die Datenbank die zu mir passt

Beitrag von Bebu » Mo Nov 30, 2009 8:16 pm

AnGaiNoR hat geschrieben:XML ist ja eigentlich kein Datenbanksystem, aber eignet sich meiner Meinung auch um Daten darzustellen. Einfach einzubetten ist es allemale und Suchanfragen lassen sich per XQuery einfach gestalten. Ich ziehe das menschenlesbare XML eigentlich einer binär gespeicherten Datenbank vor (die man ja nur schwer per Hand aus der Datei rauslesen kann).
Kann ich mir auch mal ansehen, wie ist es denn bei XML mit Eintragsindizierung und Suchanfragen in den Daten?
Xin hat geschrieben:Wenn Du Dich einliest, kannst Du das ganze auch mal hier vorstellen?
Ich kann es mal versuchen^^ Die Dokus die ich bisher gefunden habe, war das meiset auf Englisch, das bringt mich zwar nicht um, aber dafür brauche ich dann wesentlich länger, so sicher bin ich da leider nicht. Aber ich kann es ja mal ins Auge fassen ;)
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Suche die Datenbank die zu mir passt

Beitrag von Xin » Mo Nov 30, 2009 8:18 pm

Bebu hat geschrieben:
Xin hat geschrieben:Wenn Du Dich einliest, kannst Du das ganze auch mal hier vorstellen?
Ich kann es mal versuchen^^ Die Dokus die ich bisher gefunden habe, war das meiset auf Englisch, das bringt mich zwar nicht um, aber dafür brauche ich dann wesentlich länger, so sicher bin ich da leider nicht. Aber ich kann es ja mal ins Auge fassen ;)
Darum wäre es ja schön, etwas auf Deutsch zu haben ^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Suche die Datenbank die zu mir passt

Beitrag von Kerli » Mo Nov 30, 2009 9:58 pm

Ich hab das unlängst auch einmal verwendet und dazu eine kleine C++ Wrapperklasse geschrieben:

Code: Alles auswählen

//------------------------------------------------------------------------------
// sqlite_cpp.hpp
// (c) copyright 2009 Thomas Geymayer <tomgey@gmail.com>
//------------------------------------------------------------------------------

/*!
 * @file
 * @brief
 * @details
 * @author Thomas Geymayer <tomgey@gmail.com>
 * @date Date of Creation: 24.10.2009
 */

#ifndef SQLITE_CPP_HPP_
#define SQLITE_CPP_HPP_

#include <string>
#include <sqlite3.h>
#include <stdexcept>
#include <vector>
#include <map>

class SQLite
{
  public:

    typedef std::map<std::string,std::string> Row;
    typedef std::vector<Row> Result;

    //--------------------------------------------------------------------------
    SQLite( const std::string& dbase )
    {
      checkCall( sqlite3_open(dbase.c_str(), &_db) );
    }

    //--------------------------------------------------------------------------
    ~SQLite()
    {
      sqlite3_close(_db);
    }

    //--------------------------------------------------------------------------
    Result query( const std::string& query )
    {
      //std::cout << query << std::endl;

      sqlite3_stmt *stmt;
      checkCall( sqlite3_prepare_v2(_db, query.c_str(), query.size(), &stmt, 0) );

      int cols = sqlite3_column_count(stmt);
      Result result;

      while( sqlite3_step(stmt) == SQLITE_ROW )
      {
        Row cur_row;

        for( int i = 0; i < cols; ++i )
        {
          if( !sqlite3_column_name(stmt,i) )
            continue;

          std::string name( sqlite3_column_name(stmt,i) );
          if( name.empty() )
            continue;

          std::string value;
          if( sqlite3_column_text(stmt,i) )
            value = reinterpret_cast<const char*>(sqlite3_column_text(stmt,i));

          cur_row[ name ] = value;
        }

        result.push_back(cur_row);
      }

      sqlite3_finalize(stmt);

      return result;
    }

    //--------------------------------------------------------------------------
    void insert( const std::string& table,
                 const Row& values )
    {
      std::string col_names, col_values;

      for( Row::const_iterator col = values.begin();
          col != values.end();
          ++col )
      {
        if( !col_names.empty() )
        {
          col_names  += ",";
          col_values += ",";
        }

        col_names  += "`" + col->first  + "`";
        col_values += "'" + col->second + "'";
      }

      query(  "INSERT INTO " + table
            + " (" + col_names + ") VALUES (" + col_values + ")" );
    }

    //--------------------------------------------------------------------------
    Result select( const std::string& table,
                   const Row& values )
    {
      std::string checks;

      for( Row::const_iterator col = values.begin();
          col != values.end();
          ++col )
      {
        if( !checks.empty() )
          checks += " and ";

        checks += "`" + col->first + "`='" + col->second + "'";
      }

      return query( "SELECT * FROM " + table + " WHERE " + checks );
    }

    //--------------------------------------------------------------------------
    void update( const std::string& table,
                 const Row& values,
                 const std::string& where )
    {
      std::string sets;

      for( Row::const_iterator col = values.begin();
          col != values.end();
          ++col )
      {
        if( !sets.empty() )
          sets += ',';

        sets += "`" + col->first  + "`='" + col->second + "'";
      }

      query(  "UPDATE " + table + " SET " + sets + " WHERE " + where );
    }

    //--------------------------------------------------------------------------
    void deleteFrom( const std::string& table,
                     const Row& checks,
                     const std::string& id_col )
    {
      Result values = select(table, checks);

      for( Result::const_iterator row = values.begin();
          row != values.end();
          ++row )
      {
        query(   "DELETE FROM " + table
               + " WHERE `" + id_col + "`='" + row->at(id_col) + "'" );
      }
    }

  private:

    void checkCall( int retval )
    {
      if( retval != SQLITE_OK )
        throw std::runtime_error( sqlite3_errmsg(_db) );
    }

    sqlite3* _db;
};

#endif /* SQLITE_CPP_HPP_ */
Für die Abfragen und das Erstellen der Tabellen kannst du eh normales bzw. etwas eingeschränktes SQL verwenden. Es gibt zb was ich weiß nur INTEGER, TEXT, REAL und BLOB als Datentyp, aber das schaust du am Besten direkt in der Dokumentation nach.

Eine Tabelle kannst du zb mit "sqlite3 messages.db < schema.sql" aus der Kommandozeile erzeugen. Wenn die schema.sql wie folgt ausschaut:

Code: Alles auswählen

DROP TABLE IF EXISTS messages;
CREATE TABLE messages(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  inserted INTEGER NOT NULL DEFAULT 0,
  message_sent INTEGER NOT NULL DEFAULT 0,
  type TEXT,
  host TEXT,
  service TEXT,
  state TEXT,
  duration TEXT,
  email TEXT
);
dann kannst du mit folgendem Code etwas einfügen und nachher die gesamte Tabelle ausgeben lassen:

Code: Alles auswählen

int main(int argc, char* argv[])
{
  // open the database
  SQLite db("messages.db");

  // create new entry
  SQLite::Row input;
  input["type"        ] = argv[2];
  input["host"        ] = argv[3];
  input["service"     ] = argv[4];
  input["state"       ] = argv[5];
  input["duration"    ] = argv[6];
  input["email"       ] = argv[7];

  std::cout << "Inserting new notification..." << std::endl;
  db.insert("messages", input);

  // print out the database
  SQLite::Result result = db.query("select * from messages");

  for( SQLite::Result::iterator row = result.begin();
       row != result.end();
       ++row )
  {
    std::cout << "-----------------------------------------------------------"
              << "---------------------" << std::endl;
    std::cout << row->at("id")      << "|"
              << row->at("type")    << "|"
              << row->at("host")    << "|"
              << row->at("service") << "|"
              << row->at("state")   << "|"
              << row->at("duration")<< "|"
              << row->at("inserted")<< "|"
              << row->at("message_sent")
              << std::endl;
  }

  return 0;
}
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Suche die Datenbank die zu mir passt

Beitrag von Xin » Di Dez 01, 2009 2:56 pm

Hey, Kerli...

Pack sowas doch ins Wiki!
Sowas geht doch im Forum einfach unter und dann findet es wieder keiner!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Suche die Datenbank die zu mir passt

Beitrag von Bebu » Di Dez 01, 2009 7:52 pm

Hui, bin grade ganz erschlagen von meiner Unwissenheit Kerli :oops:
Deine Klasse muss ich mir mal ganz in Ruhe ansehen, mein Wissen über Klassen ist wohl noch seeeeeehhhhhrrrrr ausbaufähig.
Aber trotzdem danke dafür, ich denke das wird mir noch sehr nützlich sein.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten