Im Februar startet der Microsoft TechDay mit einer Sonderreihe. Unter dem Motto „Best Practice Day- Neues und Unbekanntes für den Systemadministrator“ geht es an fünf Tagen in fünf Städten – München, Karlsruhe, Frankfurt, Leipzig und Hamburg – um das Thema „System-Administrator“.
Die täglichen Aufgaben des SysAdmins unterstützen zahlreiche Tools, die oft unbekannt sind oder unterschätzt werden. Diese Tools, zusammen mit vielen Tipps und Tricks, werden von den Microsoft Evangelisten im Rahmen des Microsoft TechDays vorgestellt.
Weitere Infos und Anmeldung unter: http://go.microsoft.com/?linkid=9645348
Im Rahmen dieser Veranstaltung gibt es bei c++.de ein Gewinnspiel, bei dem unter anderem 2 kostenlose Eintrittskarten für den TechDay zu gewinnen sind, sowie weitere Preise:
3 Microsoft Livecams VX-7000
3 Halo 3
3 Leatherman Kick
Registrierte Benutzer von c++.de können über den folgenden Link zum Preisrätsel kommen und an dem Gewinnspiel teilnehmen. Einsendeschluß ist der 06.02.2009.
http://www.c-plusplus.net/forum/profile-var-mode-is-email-and-u-is-108643.html
Die Datenbank-FAQ
Bitte schaut ob einige eurer Fragen vielleicht schon beantwortet sind. Benutzt dazu auch die Suchfunktion. Beachtet beim posten bitte auch die gängigen Regeln -> Wie man Fragen richtig stellt
Basiswissen rund um Datenbanken und zu SQL - Links und Erklärungen über Datenbanken Basiswissen und SQL.
Datenbanken in Programmen ansprechen - Wie man Datenbanken (wie MySQL oder Access) an ein Programm anbinden kann.
Freie/Kostenlose Datenbanken - eine Liste von freien oder kostenlosen Datenbanken.
Guten Abend,
mal noch ein paar Fragen:
Kann man queries auch asynchron absetzen? Angenommen ich will eine querie abbrechen können, welche zu langen dauern würde etc. Was wäre da für ein DBMS nötig? geht das mit InfluxDB, SQLLite!?
wie ist es sinnvoll eine Datenbank zu partitionieren, wenn ich daten über einen langen zeitraum aufzeichen, und sie auch "relativ schnell" wieder abfragen möchte. Da machen wohl timeseries db am meisten sinn .. gell.. und wie partitionieren die intern?
habt ihr erfahrungen mit InfluxDB, QuestDB, TimescaleDB gemacht? sie sollte erstmal "kostenlos" sein;)
Guck dir mal Timescale DB an, vllt ist das was für deinen Fall. Ich wollte mir das auch schon immer mal anschauen, bin bis jetzt aber nicht dazu gekommen.
Edit:
Die setzt auf PostgreSQL auf, da solltest du für fast jede Plattform/Programmiersprache ein Binding zu finden.
Sqlite als Datenbank
Als Bilbiothek könnte man auch direkt Sqlite nutzen, aber vlt. ist ein wrapper ganz hilfreich:
https://github.com/rbock/sqlpp11 -> Library mit Unterstützung für mehrere Datenbanken (u.a. auch sqlite3 -> https://github.com/rbock/sqlpp11-connector-sqlite3) ... die Nutzung ist etwas komplexer und die Dokumentation eher schlecht ... aber es lohnt sich aus meiner Sicht, weil man sql abfragen aus c++ Funktionen bauen kann und entsprechend compile time checks bekommt etc.
https://github.com/SRombauts/SQLiteCpp -> Noch nicht ausprobiert, sieht aber sehr gut aus. Im Gegensatz zu ersten Lib ist diese nur ein Wrapper für Sqlite3 und sehr minimalistisch. Also insgesamt einfacher zu verwenden, dafür ist man halt an Sqlite3 gebunden und hat hat keine compile time checks etc. -> Basierend auf deiner Beschreibung, klingt das nach ner guten Lib für dich
@hustbaer Hab lange nichts mehr mit Datenbanken gemacht und hätte erwartet, dass es da mittlerweile für jeden für SQL-Injection anfälligen Kontext eine Standardlösung gibt. Das Problem existiert ja nicht erst seit gestern und gehört meines Wissens immer noch zu den Top Sicherheitsproblemen
Eine simple und sichere Lösung ist wohl, einfach sicherzustellen, dass die Anwendung stets den Dateinamen kontrolliert. Erlaubt man Anwendern z.B. eine beliebige Datei hochzuladen, die dan via BULK INSERT eingefügt wird, sollte eben nicht der vom Anwender vorgegebene Name verwendet werden, sondern stattdessen ein selbst generierter, temporärer Dateiname.
Bei dynamischen Tabellen- und Spaltennamen kann man zum validieren wohl prüfen, ob die Datenbankobjekte überhaupt existieren (Interessant übrigens, dass man wohl auch eine Tabelle anlegen kann, die "Users; DROP TABLE dbo.Users;" heisst - da vergeht mir schon gleich die Lust, sowas korrekt und sicher selbst zu implementieren, besonders wenn da noch die Regeln für gültige Dateinamen mit reinspielen ).
Man muss sich hier auf jeden Fall überlegen was "die Klasse" ist. mMn. ist das beste eine Klasse so zu definieren dass in üblichen Fällen ein Schüler der nie sitzen bleibt und nie "versetzt" wird immer in der selben Klasse bleibt.
D.h. die Klasse ist dann vielleicht "2017,3" (unveränderlicher Primärschlüssel).
Diese hat dann verschiedene Attribute wie z.B. "Schuljahr=7" und "Suffix=B" die sich ändern können und aus denen der "Display-Name" gebastelt wird wenn man ihn braucht ("7B"). (Bzw. wenn man will kann man den "Display-Name" auch als persistiertes Attribut abspeichern, aber ich würde das vermeiden so lange es nicht notwendig wird.)
Ein Schüler hat dann ein Attribut "Klasse" wo seine aktuelle Klasse drinnen steht, also in diesem Beispiel "2017,3".
Änderungen kann man dann mit eigenen Tables tracken. Man kann z.B. für jeden Table einen History-Table anlegen. Der sieht aus wie der primäre Table, bloss dass er zusätzlich noch ein Attribut "Änderungsdatum" hat welches mit zum Primärschlüssel zählt (composite key).
Damit lässt sich für jedes beliebige Datum rekonstruieren ob es einen bestimmten Schüler (aus Sicht der Schule) zu diesem Zeitpunkt schon gegeben hat, in welcher Klasse er damals war, wie die Klasse damals geheissen hat etc.
Bis hierher geht das mit vielen DBMS noch automatisch, z.B. über Trigger die sich darum kümmern dass die nötigen History-Einträge erzeugt werden ohne dass man es überall immer wieder ausprogrammieren muss.
Zusätzlich kann man in solche History-Tables auch weitere Attribute aufnehmen wenn man möchte. z.B. kann man einen Grund für die Änderung reinschreiben. Entweder einfach als Text oder wenn es Sinn macht auch als Verweis auf eine andere Tabelle. Wenn ein Schüler versetzt wird könnte man z.B. eine Tabelle haben wo diese Versetzung als Entity erfasst wird. Die Schüler-History-Tabelle könnte dann ein (nullable) Attribut Versetzungs-ID haben, wo die entsprechende Versetzung verlinkt wird wenn man die Versetzung "manifestiert" (die Klassen-ID der Schüler-Zeile ändert + den dazugehörigen History-Eintrag erzeugt).
Das kann man dann allerdings nicht mehr einfach über Trigger machen.
So habe ichs jetzt umgesetzt:
Tabelle Anschluss (ID, Beschreibung)
ID Beschreibung
1 usb
2 com
3 com
...
Tabelle com (fk_anschluss references Anschluss (ID))
ID Setting1 Setting2 ...
2 'Setting1' 'Setting2' ...
...
Das selbe für die Anderen Anschlüsse auch. Da ich so ja nicht verhindern kann das in der com Tabelle zb was mit der ID 1 eingetragen wird. Hab ich mir ein Constraint check zusammengebaut wo ich prüfe ob ID UND Bezeichnung in der Anschlusstablelle existieren.
create function fnCheckID (@Input varchar(45), @id int)
returns bit
AS
begin
declare @Val varchar(45)
declare @RetVal bit
select @Val = (select type from Connection c
where c.idConnection = @id and
c.type = @Input)
if (@Val is not null)
set @RetVal = 1
else
set @RetVal = 0
return @RetVal
end
Ist vielleicht etwas umständlich, aber funktioniert soweit.
ABER:
Wird die Bezeichnung in der Tabelle Anschlussart jetzt verändert, dann passts natürlich nicht mehr.
Gibt es die Möglichkeit so ein Constraint in beide Richtungen zu machen? Vielleicht weiß ja einer von euch was.
lg Liz
Edit
Ich glaube ich machs mir da viel zu komlpiziert. Nehme ich die Beschreibung auch noch als Fremdschlüssel in der com Tabelle auf, dann umgehe ich das Problem der inkosistenz. Richtig?
@DocShoe sagte in Abfrage über 3 Tabellen, Zeile mit höchstem Wert als Condition bestimmen:
@Swordfish
Keine Ahnung, was du mir sagen willst. Schlechte Laune? Bei Postgres galten CTEs als Optimization Fence, kA, ob das immer noch so ist. Und deshalb muss ich benchmarken, ob die CTE Lösung langsamer ist als die Lösung mit zwei identischen Subqueries. Weiß jetzt echt nicht, wo dein Problem liegt.
No problem at all. Du bestätigst nur das was ich geschrieben habe. Miss die Kacke.
@hustbaer sagte in Abfrage über 3 Tabellen, Zeile mit höchstem Wert als Condition bestimmen:
Das ist natürlich keine Rocket-Science, aber es kostet Zeit.
Ja, das kostet Zeit. Wenn man das so in ein Forum knallt kostet es jedem der es liest Zeit. Ich würde mich sowas nicht trauen bzw. es würde meiner Nächstenliebe zuwider sein.
Hallo Leon0402,
Ich beschäftige mich schon seit geraumer Zeit mit objektorientierten Datenbanken für C++-Klassen. Das Ziel ist ja, Objekt zu speichern ohne sich um das wie zu kümmern.
Schau Dir doch mal GlobalObjects an, vielleicht ist das etwas für Dich. Ist open source und eigentlich schon weit gediehen.
Einen schnellen Überblick bekommst Du über die Videos.
Gruß Helmut
@DocShoe sagte in DBMS gesucht:
@john-0
Irgendwie erinnern mich deine Antworten immer an MS-Doku. Technisch korrekt, aber irgendwie nicht zu gebrauchen.
Du bist auf einem Tripp der die Dich in die komplett falsche Ecke führt, sehen willst Du das aber nicht. Weshalb nutzt Du überhaupt ein RDBMS, wenn es eine simple Textdatei auf einem Fileserver auch täte bzw. ein Blob im RDBMs? Die Vorteile eines RDBMS nutzt Du durch Deiner Art und Weise der Nutzung des selben definitiv nicht. Key-Value-Paare legt man in keinem RDBMS ab, denn die „Keys“ gehören in die Tables d.h. der Struktur der Datenbank.
Anstatt nun die Bohrhammer dafür zu nutzen ein Loch zu bohren, dieses anschließend aus zu saugen, dann einen Dübel rein zu stecken und anschließend die Schraube einzuschrauben, hast Du Dich dazu entschlossen mit dem Hammer die Schraube in die Wand zu schlagen. Ja, das geht, aber sinnvoll ist es nicht.
Ist mir schon klar. Ich verstehe bloss deinen Beitrag
@Wutz sagte in Sqlite Variablen in Datenbank einfügen:
Dafür existiert der 1.Parameter in callback und der 4. in sqlite3_exec.
nicht. Weil der nichts mit dem hier Diskutierten zu tun hat.
@RudiMBM
Dann fallen mir nur diese Optionen ein:
ASCII Kodierung als Hex, damit kannst du auf Attribute deines Datentyps anhand von Substrings zugreifen, wid mitm Indizieren aber wohl schwierig. KA, wie gut MySQL Indzierung von Substrings unterstützt
Attribute deines Datentyps in eigener Spalte ablegen
deinen Datentyp als JSON Objekt ablegen. Auch hier weiß ich nicht, wie gut MySQL JSON Objekte indizieren kann.
@DocShoe sagte in MySQL Connector C++:
Ansonsten hast du recht, viele tausend einzelne Queries sind oft langsamer als eine Query mit einer komplexen where-Klausel.
@Leon0402 sagte in Datenbank für C++:
Sehr spannendes Thema, aber bitte in einem anderen Thread.
Die hier nicht mehr sichtbare Diskussion findet man nun hier:
https://www.c-plusplus.net/forum/topic/351066/ständig-wachsende-komplexität-im-programmiereralltag-fork-aus-datenbank-für-c/9