DB-Design, String als Markierungsfeld, was haltet Ihr davon?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

DB-Design, String als Markierungsfeld, was haltet Ihr davon?

Beitrag von Soner »

Hallo,
Ich überlege in Tabellen ein Char-Feld mit feste Länge einzuführen, um verschiedene Zustände zu markieren, wie z.B. gedruckt, zur Bearbeitung gespert, versendet, etc..
Da ich nicht weiß wieviele Zustände existieren werden, habe ich gedacht ein einzelnes Feld ist leichter zur erweitern als jedesmal neues Feld zu erstellen.
Nehmen wir an Ich habe am Anfang habe ich 2 Zustände, gedruckt, versendet. Dann steht erstes Zeichen für gedruckt, zweites für versendet. Wenn jetzt nach ein Jahr neues Zustand kommt, dann nehme ich einfach das dritte Zeichen.
Am Anfang definiere ich das Flag-Feld als CHAR(12) damit genug Platz für Erweiterungen gibt. Firebird hat auch die Funktion SUBSTRING mit dem man in SQL Abfragen machen kann.

Ich verwende Firebird 2.5 (Eigentlich FB3 aber FB3 gibt es bei MacOs nicht, jetzt muß ich 2.5 downgraden)

Was haltet Ihr von der Idee?

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von Soner »

Gibt es denn in SQL ein FUnktion womit man ein bestimmtes Zeichen in ein String ändern kann, sowie:
STRING[n]:='A'
in Pascal?

Es gibt eine Replace-Funktion aber bei der Funktion kann man keine Positionsangabe machen.

EDIT:
Jetzt habe ich es gefunden, es heißt OVERLAY.
https://www.firebirdsql.org/refdocs/langrefupd21-intfunc-overlay.html

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von Socke »

Soner hat geschrieben:Ich überlege in Tabellen ein Char-Feld mit feste Länge einzuführen, um verschiedene Zustände zu markieren, wie z.B. gedruckt, zur Bearbeitung gespert, versendet, etc..
Da ich nicht weiß wieviele Zustände existieren werden, habe ich gedacht ein einzelnes Feld ist leichter zur erweitern als jedesmal neues Feld zu erstellen.
Nehmen wir an Ich habe am Anfang habe ich 2 Zustände, gedruckt, versendet. Dann steht erstes Zeichen für gedruckt, zweites für versendet. Wenn jetzt nach ein Jahr neues Zustand kommt, dann nehme ich einfach das dritte Zeichen.
Am Anfang definiere ich das Flag-Feld als CHAR(12) damit genug Platz für Erweiterungen gibt.

Das war vor 30 Jahre durchaus üblich :D. Wenn die verschiedenen Statuswerte semantisch zusammengehörig sind (z.B. der Status in einem Prozess) ist das meiner Meinung nach ein durchaus akzeptabler Weg.
Sinnvollerweise soltest du die verschiedenen Werte in Pascal auf ein Enum oder ein Set abbilden.

Solltest du hingegen in dem einn CHAR(12)-Feld verschiene Bedeutungen zusammfassen, wiederspricht das den allgemein akzeptierten Richtlinien der Normalisierung beim Design einer Datenbank.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von Eb »

Ich würde dafür ein Feld 'status' anlegen mit Datentyp smallint. Dann würde ich eine weitere Tabelle machen mit zwei Feldern 'status', smallint, und 'benennung', char [12], in der die Zuordnung zum String drin steht. Das braucht weniger Speicher und ein zahlenvergleich in einer where-Bedingung ist performanter als ein stringvergleich.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von Soner »

Danke für die Antworten.

@Socke:
Der Hinweis mit vor 30 Jahren gut, weil damals für Markierungen meistens Bits genutzt wurde. :D
Ich habe gedacht, ich kann auch Markierungsfeld als Integer definieren, dann kann ich nur mit 4 Bytes 32 mögliche Zustände verwenden.

@Eb:
Ich versuche möglichst wenige Tabellen zu verwenden, wenn Daten über viele Tabellen verteilt sind, dann muß man immer auch bei einfach Sachen viele SQL-Statements hintereinander ausführen.


Ich glaube ich verwende Integer-Feld.
Falls jemand sich für sowas interessiert, es gibt in Firebird Funktionen für Bitmanupilation BIN_AND, BIN_OR, BIN_SHL, BIN_SHR, BIN_XOR und BIT_LENGTH, z.B.:
https://firebirdsql.org/refdocs/langrefupd25-intfunc-bin_and.html

Das zeigt alle Datensätze bei denen 2.Bit gesetzt ist:
SELECT FLAGFELD FROM TABLE1 WHERE BIN_AND(FLAGFELD,2)=2

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von theo »

Bietet sich dafür nicht ein SET Typ an?
Ich habe etwas ähnliches gemacht im Anhang (in PHPMyAdmin).

EDIT: Sorry, ist nat. nicht Firebird sondern MySQL
Dateianhänge
mysqlset.png

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von Soner »

Du hast eigentlich Recht, bisner habe ich "komplizierte" Datentypen nie verwendet. Ich schaumal ob das in Firebird gibt und wie man das später in SQL-Komponenten handhabt.

P.S.:
Falls jemand an Firebird Reference in CHM-Format interessiert ist, ich habe die Seiten komplett heruntergeladen, CHM-Datei erstellt und an Firebird-Webseite geschickt, die müßten das dann in einigen Tagen für Download Online stellen.
Ich finde CHM-Format gut, weil man da gut suchen und finden kann.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von theo »

Habe keine Ahnung von Firebird.
Aber ich kann dir noch ein Beispiel geben, wie man Set (Mehrfachauswahl) und Enum (Einfachauswahl) in MySql defniert.
Vielleicht hilft's ja. :wink:

Code: Alles auswählen

 
CREATE TABLE IF NOT EXISTS `personen` (
  `pers_id` mediumint(8) UNSIGNED NOT NULL,
  `taetigkeit` SET('Komponisten','Improvisatoren','Interpreten','Autoren','Forscher','Regisseure','Choreografen') NOT NULL DEFAULT '',
  `sprache` enum('D','F','I','E') NOT NULL DEFAULT 'D'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: DB-Design, String als Markierungsfeld, was haltet Ihr da

Beitrag von Soner »

Sets(Mengen) mache ich immer mit Hilfe 2 Tabellen, eine Definitionstabelle und eine Verknüpfungstabelle. Es ist Datenbank unabhängig, leichter erweiterbar und mit LCL-Controls leichter anzuzeigen und zu bearbeiten.

Wenn ich rechtüberlege Enum ist ja nicht anderes als Bitweise-Manupilation das der Compiler/SQL-Server vor Programmier versteckt.
Und dazu wenn ich die Bitweise-Manupilation selber mache, dann bin ich ja wieder Datenbank und Programmiersprache unabhängig.

Danke euch für die Vorschläge und Anregungen.

Antworten