eigene kleine Datenbank mit C++ bauen
-
Hey!
Ich habe mir gerade spontan überlegt den gesamten Bestand an CDs,DVDs und Büchern(wobei das der größte Teil ist) in eine Datenbank zu bringen. Da ich Datenbanken wie MySQL etc. für diesen Zweck etwas zu groß finde (und es hier natürlich auch ums selber machen geht ;)) hatte ich mir überlegt was eigenes zu bauen.
Meine Idee:
Alle Dateien in eine normale txt Datei schreiben und die einzelnen Datensätze nach Größe trennen. Also ein gesamter Datensatz (z.b. ein Buch, mit Titel,Autor,Thema etc.) wäre dann z.B. 10Byte groß. Dann würde ich es mir sparen die gesamte Datei zu parsen, ich würde dann direkt immer 10Byte weiterspringen und z.B. nur den Titel auslesen.
Damit würde ich dann eine Liste aus z.B. Titel + Nummer in der Datei (z.b. der 5 Datensatz, also beginnt der Datensatz bei Byte 50) erstellen. Diese dürfte doch (auch bei vielen Einträgen) noch relativ gut im Speicher zu handeln sein oder nicht?
Entsprechend kann ich dann auch Sortier und Suchalgorithmen auf diese Liste anwenden.
Einziges Problem bei diesem Verfahren wäre nur: Ich brauche für jeden Eintrag im Datensatz eine eigene Liste. D.h. wenn ich nach Titel sortieren will, muss ich eine Liste haben, die nur die Titel enthält. Wenn es nach Autoren gehen soll, brauche ich quasi eine "Autoren-Liste" usw.
Was haltet ihr von der Idee und vorallendingen wie setze ich diese Einteilung nach Byte + dem Weiterspringen in der Datei um? (oder gehört dass dann ins C++-Forum?)Bin für Anregungen offen
Gruß
Pille
-
Mit einem kleinen DBMS fährst du auf längere Sicht angenehmer und kannst deine Brainpower in andere Sachen investieren. Schau dir doch mal sqlite an http://www.sqlite.org/.
-
Hmm SQLite sieht eigentlich ganz cool aus. Es hat zumindest zwei Vorteile die mich an den Datenbanksystemen die ich kenne gestört hat: Teils für den Zweck unnötig komplex und es war immer eine Serveranwendung erforderlich.
Nur zwei Fragen zu SQLite, die ein flüchtiger Blick auf der Homepage so nicht klären konnte:
- Unterstüzt die Datenbank (wie z.B. MySQL) eine Art Sortier- und Suchfunktion oder muss ich das selber implementieren? Anders gefragt: Lese ich eine Tabelle zeilenweise aus oder wie wird das gehandhabt?
- Wie sieht das performance mäßig dann aus? Lohnt es sich dann, sofern keine Sortier/Suchfunktion enthalten die gesamte Tabelle in den Speicher zu laden oder fährt man dann einfacher die Tabelle Stück für Stück auszulesen?
-
Auf Daten in einer SQLite Datenbank greifst du per SQL-Query zu. SELECT * FROM blabal und soweiter. Dabei kannst du natürlich auch ORDER BY und WHERE benutzen. Sollte im großen und ganzen wohl ANSI-SQL Kompatibel sein.
-
- Unterstüzt die Datenbank (wie z.B. MySQL) eine Art Sortier- und Suchfunktion oder muss ich das selber implementieren? Anders gefragt: Lese ich eine Tabelle zeilenweise aus oder wie wird das gehandhabt?
- Wie sieht das performance mäßig dann aus? Lohnt es sich dann, sofern keine Sortier/Suchfunktion enthalten die gesamte Tabelle in den Speicher zu laden oder fährt man dann einfacher die Tabelle Stück für Stück auszulesen?das ganze gilt für c:
du kannst mit sqlite eine sql-abfrage über die eine von sqlite bereitgestellte interne funktion ausführen. dabei musst du eine callback-funktion angeben, die bei JEDEM neu zurückgegebenen datensatz angesprungen wird. den inhalt dieser funktion kannst du dir selbst gestalten, d.h. du kannst entweder
a) datensatzweise verarbeiten und wenn du fertig bist die callback-funktion einfach mit "return -1" beenden oder
b) in der callback-function alle datensätze im ram speichern und sie danach verwurstenvom thema speed her ist sqlite extrem schnell, angeblich sogar schneller als mysql. ich nehme für alle meine projekte in denen ich irgentwie daten verarbeiten muss nurnoch sqlite. das ist einfach das nonplusultra -einfach zu handhaben, extrem schnell, komplett frei (public domain).
-
Der Vollständigkeit halber: SQLite kann natürlich auch ganze Tabellen zurückliefern,
auch ohne Callback. SQLite ist einfach genial, einfach und plattformübergreifend.ch würde dann direkt immer 10Byte weiterspringen u
... was ein Unsinn. Mit solchen Grundlagen ist es egal was Du für ein DBMS verwendest.
Generell braucht es bei Datenmengen unter 100 MB keine Datenbank. In den Speicher lesen
und auswerten geht erheblich schneller (die 100 MB sind natürlich willkürlich gewählt, halt
so die Größemordnung).
-
@Scheppertreiber:
Wobei es auch bei sehr kleinen Datenbeständen einfach praktisch sein kann, eine Datenbank-Engine zu verwenden.
-
Wenn du auf Windows bleibst kannst DU auch MSSQL Compact verwenden.
Wenn Du NET (c#) verwendest sogar auch Gratis mit dem neues was Microsoft zu ieten hat.
Visual Studio 2008.
-
Generell braucht es bei Datenmengen unter 100 MB keine Datenbank
dem möchte ich höflich wiedersprechen.
ich programmiere gerade an einem projekt, wo die datenmenge maximal 10mb ausmacht, ich aber
a) hunderte verschiedener objekte mit jeweils individuellen eigenschaften habe
b) diese objekte über eine komplizierte struktur miteinander verknüpft sindallein die verknüpfung zwischen den objekten auf andere art als daetnbanktechnisch abzubilden, wäre viel aufwand. ich könnte das zwar auch in .csv textdateien machen und die zum programmstart einlesen, aber der aufwand die erstmal zu parsen und die zusammengehörenden daten aus verschiedenen dateien zu verknüpfen.
10mb sind für eine db ohne binärdaten u.u. schon viel. beispiel(ich rechne nur mit 9mb, 1 mb für die interne verwaltung):
ich habe 10 tabellen, jede der tabellen hat 10 int-spalten.
das macht pro tabelle 50byte speicheraufwand für einen datensatz.
insgesamt kann ich so 188.743 datensätze speichern, oder pro tabelle
18.874 datensätze. und hunderttausend datensätze sind viel, das würde ich nicht anders verwalten wollen als über eine db.
-
Klar, das hängt vom Einsatzzweck ab.
Ich habe (fast nur) große Datenmengen ohne aufwändige Verknüpfungen.
SQLite läßt sich auch bei kleineren Datenmengen auch gut einsetzen.
Halt wenn's sinnvoll ist ...
-
Scheppertreiber schrieb:
ch würde dann direkt immer 10Byte weiterspringen u
... was ein Unsinn. Mit solchen Grundlagen ist es egal was Du für ein DBMS verwendest.
Was genau ist daran Unsinn? Die Datengröße, also 10Byte an sich? Wenn ja, das war nur ein Beispiel, würde dann natürlich schon (nach oben)variieren.
-
Das da
Also ein gesamter Datensatz (z.b. ein Buch, mit Titel,Autor,Thema etc.) wäre dann z.B. 10Byte groß.
-
Man kann da glaube ich die
sizeof()
- Funktion gut verwenden. Die müsste dir sagen das ein einzelner Buchstabe schon 4 Byte verbraucht.
-
aber ein byte hat 8 bit;
0 0 0 0 0 0 0 0 und der wert 255 ist 1 1 1 1 1 1 1 1 kannst damit aber alle ASCII zeichen ausdrücken wennst nur buchstaben und sonderzeichen hast kannst ja versuchen eine eigene Zeichentabelle zu erstellen und 2 zeichen in ein byte legen was dann den speicher verkleinert ... nur sone spontanidee