AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Gibt es ein DBMS mit einer Art Pointer-Typ?
Thema durchsuchen
Ansicht
Themen-Optionen

Gibt es ein DBMS mit einer Art Pointer-Typ?

Ein Thema von Medium · begonnen am 17. Okt 2017 · letzter Beitrag vom 17. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 02:44
Datenbank: Gesucht • Version: egal • Zugriff über: bevorzugt UniDAC
Hallo DP!

Ich hatte heute eine etwas "wilde" Idee, wie ich die Write-Performance unserer HMI-Client-Server Suite verbessern könnte. Aktuell steckt hier eine MariaDB/MySQL hinter, und je nach (projektspezifischem) Aufbau der Daten in der SPS landen diese aus diversen Quellen (ich definiere hier mal "eine Quelle" als eine am Stück übertragbare Menge an Daten von der SPS) in diversen Tabellen. Mit quasi beliebigem Datentyp. Theoretisch kreuz und quer, und diese Flexibilität möchte ich uns auch erhalten. (Bzw. muss, da viele alte Steuerungen noch nicht diesbzgl optimiert strukturiert wurden.)

Es wäre, sowohl beim Lesen aus der SPS als auch beim Schreiben in die DB, viel performanter, wenn ich jeweils ein paar hundert Bytes am Stück verarbeiten könnte. Quasi ein Binärabbild der Speicherbereiche in der SPS in ein Blob-Feld in die DB werfen. (*) Dazu hätte ich gerne eine Kreuztabelle, die mir für jeden tatsächlichen Wert angibt in welcher Tabelle, in welchem Feld (Blob), ab welchem Byte und mit welchem Datentyp mein gewünschter Wert liegt.
Dazu möchte ich aber ungerne immer den gesamten Blob aus der DB fischen und in meinem Programm zerstückeln, sondern am liebsten mein Interface zur DB weitgehend gleich behalten. Ich möchte quasi SELECT ist_wert FROM analogwerte WHERE feldname = 'DRUCK_1.0' schreiben können (nicht zwangsweise diese Form, aber mit diesen Parametern), es gibt aber gar keine Tabelle "analogwerte". Sondern stattdessen eine Tabelle, in der steht: Nimm dieses aus der Tabelle "datenbasis" aus der Spalte "raw_data" (der Blob) mit der id N, und zwar ab Byte 78, und gib das als 2-Byte Integer ohne Vorzeichen zurück.

Dann könnte ich nämlich einfach die Datenbausteine aus der SPS komplett in die DB werfen, und zwar auch deutlich öfter als nur jede Sekunde ein Mal, und habe mit dem Zerpflücken in logisch korrekte Strukturen in meinem Programm nicht mehr zu viel am Hut.

Lohnt es sich überhaupt in diese Richtung weiterzudenken, oder gibt es kein DBMS welches sowas auch nur im Ansatz könnte? (Ich möchte ungerne Plugins für ein DBMS schreiben dafür. Es sollte alles via SQL und Ab-Werk-Funktionen gehen.)

Kennt ihr ein DBMS, das sowas in der Art liefern könnte?
Vielen Dank schon mal!

*) Beim Lesen aus der SPS mache ich das schon, zerstückel dann aber die Daten anhand der vorgegebenen Struktur in der SPS und trage dann alle Werte einen nach dem anderen in die DB ein. Das wird bei ein paar hunderten irgendwann recht langsam, selbst wenn ich mittlerweile pro Tabelle sogar mit nur einem INSERT auskomme. Da dort aber heftige WHERE-IN-() und CASE Konstrukte enthalten sind (da nicht jedes mal immer alle Zeilen und/oder die gleichen Spalten einer Tabelle in einem Durchgang beschrieben werden), ist das in entsprechender Menge ebenfalls bremsend. Besonders wenn zudem auch noch repliziert wird!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (17. Okt 2017 um 02:51 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 08:11
Ich denke schon, das das geht, auch in mySQL. Du kannst deine SQL Statements ja dynamisch erzeugen, also auch den Tabellennamen über eine Funktion erzeugen lassen. Oder du baust dir entsprechende Views. Oder du arbeitest mit derived tables.

Ich würde mal so beginnen, dass ich eine Struktur baue, die die Daten so aufnimmt, wie ich es gern hätte + dann überleg ich mir mögliche Zugriffspfade.

Aber leider: In der Regel geht entweder schreiben oder lesen schnell - und je komplexer die Daten, desto deutlicher wird der Unterschied. Soll heißen, du musst möglicherweise überlegen, wie hoch der Preis ist, den du beim Lesen bezahlen möchtest.

In Pseudocode könnte das ja so aussehen:

select start from ... Where ...
select length from ... Where ...

SELECT ist_wert FROM
(select substr(rawdata, start, length) as ist_wert from rawdatatable) as analogwerte
WHERE feldname = 'DRUCK_1.0'
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 10:59
Hmm, was mir hier fehlt ist der cast der Datentypen. Ich Lese ja keine Strings aus der SPS, sondern Binärdaten. Mit einem Substr() werde ich da glaube ich nicht anrücken können, oder?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 11:25
Ich sehe da am ehesten Oracle und im Nocost Bereich Postgres.
Beide verfügen über mächtige Programmierfähigkeit und Typenfähigkeiten.
Auch wenn ich Dich so verstanden habe, dass Du die nur indirekt (über SQL) nutzen willst. Im Notfall wären noch anonymous blocks einsetzbar.
Clientseitig kann man natürlich beliebiges SQL zusammensetzen und "viel" erreichen. Ich stelle mir das allerdings an zentraler Stelle serverseitig "schöner" vor, halt nicht so basisdemokratisch.
Unabhängig von der Programmierung sehe ich auf jeden Fall JSON bzw. konkret JSONB als Typ bei Postgres.
Alternativ noch Key/Value Implementierungen.
M.E. kann man Variable:Wert:Typ aber sehr gut und dynamisch mit JSON(B) abfackeln (plus andere nicht unerhebliche Themen wie Indizierung, Konvertierung, ..)
Meine Vorstellung würden entgegen einer clientseitigen Implementierung in Richtung Interfacing auf DB Seite gehen. Also ein Set von Views, Schemata, vlt ein paar SP und definierte JSON Strukturen, mit denen Du die "Tabellen" definierst und baust, die Deine gewünschten Abfragen ermöglichen.

P.S.: Cast/Typisierungs Möglichkeiten bei Postgres würde ich als "herrlich" bezeichnen.
Gruß, Jo
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 11:39
Ui, da sind ein paar Techniken und Begriffe bei, zu denen ich erst etwas mehr lesen muss Klingt aber grob nach der richtigen Richtung. Danke!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 12:11
Hmm, was mir hier fehlt ist der cast der Datentypen. Ich Lese ja keine Strings aus der SPS, sondern Binärdaten. Mit einem Substr() werde ich da glaube ich nicht anrücken können, oder?
Naja, ich kenn deine Daten ja nicht + wie gesagt: Pseudocode. Wenn du Binärdaten in Text umwandeln möchtest, bevor du darauf zugreifst, kannst du sie ja umwandeln. Ob du CAST verwendest oder dir eine Funktion schreibst, hängt von deinen Daten ab.

Was du auch machen kannst, ist ein zweites Feld, in dem die konvertierten Daten landen. Dann benutze für das INSERT schnelles schreiben + beim erstmaligen Zugriff konvertierst du die Daten + greifst in Folge auf diese zu. Also viele Möglichkeiten :- )

Ob du das Clientseitig machst oder im Server via Trigger/stored procedures/functions/views etc. ist noch mal eine andere Sache.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 12:44
Die Frage war ja eben welche DBMS sowas in z.B. SPs ermöglichen. Ich muss ja in der SP auf ein BLOB zugreifen, und dort ein paar beliebige Bytes herausfischen, casten (und sogar die Byte-Order vertauschen) und zurückgeben. Das wären low-level Funktionen, die mir bisher nicht in SQL begegnet sind.
Ich will das auch definitiv alles serverseitig machen! Der Client soll auf eine Abfrage hin einfach seinen einen, fertig aufbereiteten Wert bekommen, wie bisher auch. (Und das am besten noch mit nur kleinen Änderungen an der Abfrage, ich will nicht jedes Mal ein 8k langes Script mit schicken müssen )
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 13:19
Schau bitte mal, ob Du in dem Umfeld von PostGres: SQL Binary String Functions and Operators Funktionalitäten findest, die für Deine Problemlösung hilfreich sein könnten.

Wenn ja, müssten sich damit Datenbankfunktionen schreiben lassen können, die eingebunden in Selects, Views ..., Deinen Vorstellungen nahekommen.

Wenn ich Deine Aufgabenstellung und die Dokumentation zu PostGres halbwegs rechts verstanden haben sollte, müsste damit sowas in der Art SELECT Funktion_Ist_Wert(Blobspalte) as ist_Wert FROM analogwerte WHERE feldname = 'DRUCK_1.0' funktionieren.

Eingebetten in Views dürfte dann im Programm Dein gewünschtes SELECT ist_wert FROM analogwerte WHERE feldname = 'DRUCK_1.0' funktionieren.
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 13:32
Wenn ich dich richtig verstanden habe, benutzt du mySQL:
Zitat:
In some cases, it may be desirable to store binary data such as media files in BLOB or TEXT columns. You may find MySQL's string handling functions useful for working with such data.
https://dev.mysql.com/doc/refman/5.7...functions.html

Da ist alles, was du brauchst. Da gehen auch so Sachen wie SUBSTRING deines BLOBs oder select where BLOB = x'...' zum binären Vergleich etc.

Solltest du weitersuchen wollen, so haben Oracle, Postgres, MSSQL, Firebird etc ähnliches an Bord. Vor allem Oracle, aber auch MSSQL 2016 können da ein paar wirklich coole Sachen,. aber ich hätte dein Problem nicht so verstanden, dass du deshalb umsteigen müsstest.

Aber vielleicht übersehe ich etwas.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Gibt es ein DBMS mit einer Art Pointer-Typ?

  Alt 17. Okt 2017, 14:06
Mein Hinweis auf PostGres war nur als Idee gedacht.

Frei nach dem Motto: Oh, die haben sowas, dann such' ich mal, ob's das auch für meine DB gibt.

Es war nicht als Vorschlag für "Erstmal die Datenbank wechseln und dann weitersehen" gedacht.

Hiermit Bei Google suchenBinary String Functions and Operators gibt es Ergebnisse quer durch die Datenbankwelt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz