DB-Design, String als Markierungsfeld, was haltet Ihr davon?
-
- Beiträge: 725
- 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?
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?
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?
-
- Beiträge: 725
- 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
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/lan ... erlay.html
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/lan ... erlay.html
-
- Lazarusforum e. V.
- Beiträge: 3177
- 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
Das war vor 30 Jahre durchaus üblichSoner 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.

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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Lazarusforum e. V.
- Beiträge: 240
- 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
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.
-
- Beiträge: 725
- 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
Danke für die Antworten.
@Socke:
Der Hinweis mit vor 30 Jahren gut, weil damals für Markierungen meistens Bits genutzt wurde.
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/langref ... n_and.html
Das zeigt alle Datensätze bei denen 2.Bit gesetzt ist:
SELECT FLAGFELD FROM TABLE1 WHERE BIN_AND(FLAGFELD,2)=2
@Socke:
Der Hinweis mit vor 30 Jahren gut, weil damals für Markierungen meistens Bits genutzt wurde.

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/langref ... n_and.html
Das zeigt alle Datensätze bei denen 2.Bit gesetzt ist:
SELECT FLAGFELD FROM TABLE1 WHERE BIN_AND(FLAGFELD,2)=2
Re: DB-Design, String als Markierungsfeld, was haltet Ihr da
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
Ich habe etwas ähnliches gemacht im Anhang (in PHPMyAdmin).
EDIT: Sorry, ist nat. nicht Firebird sondern MySQL
-
- Beiträge: 725
- 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
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.
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.
Re: DB-Design, String als Markierungsfeld, was haltet Ihr da
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.
Aber ich kann dir noch ein Beispiel geben, wie man Set (Mehrfachauswahl) und Enum (Einfachauswahl) in MySql defniert.
Vielleicht hilft's ja.

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;
-
- Beiträge: 725
- 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
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.
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.