Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Welches Format für Datensatzstatus (https://www.delphipraxis.net/113076-welches-format-fuer-datensatzstatus.html)

guidok 2. Mai 2008 10:23

Datenbank: MySQL • Version: 5 • Zugriff über: Zeos

Welches Format für Datensatzstatus
 
Hallo,

ich füge Datensätze in eine Tabelle ein, die folgenden Status annehmen können (diesen Status bekomme ich so aus einer Importdatei geliefert):

ANGL = Angelegt
INAK = Inaktiv
LÖVM = Löschvermerk

Diese können jetzt natürlich auch gemeinsam auftreten, also ANGL INAK oder ANGL LÖVM.

Derzeit wird der Status als VARCHAR Feld geführt in dem ich den Status als Text ANGL, INAK, LÖVM schreibe.

Nach dem Auslesen der DB stelle ich mit Pos() fest welcher Status vorliegt. Ich finde das jetzt nicht so wahnsinnig geschickt und würde das gerne ändern, aber wie? Und wie kann ich gleich bei der SQL-Abfrage Datensätze mit einem bestimmten Status erhalten?

Wobei der Vorteil der o.g. Methode wäre, dass bei zusätzlichen Statusinformationen an der DB-Struktur nichts geändert werden müsste...

Danke,
Guido

mkinzler 2. Mai 2008 10:30

Re: Welches Format für Datensatzstatus
 
Ich würde die Stati in eine eigene Relation auslagern

tomsel 2. Mai 2008 10:35

Re: Welches Format für Datensatzstatus
 
Bei Beibehaltung der DB-Struktur würde mir da spontan "like" einfallen, zumindest, solange diese Abkürzungen so gewählt werden, dass sie sich nicht ähneln (also die eine nicht in der anderen enthalten ist). Also z.Bsp.
SQL-Code:
select * from tabelle where status like '%INAK%' or status like '%LÖVM%'

Jelly 2. Mai 2008 10:38

Re: Welches Format für Datensatzstatus
 
Zitat:

Zitat von mkinzler
Ich würde die Stati in eine eigene Relation auslagern

Und dazu noch eine m:n Beziehungsrelation.

mkinzler 2. Mai 2008 10:54

Re: Welches Format für Datensatzstatus
 
Das hatte ich gemeint

Sharky 2. Mai 2008 10:56

Re: Welches Format für Datensatzstatus
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von mkinzler
Ich würde die Stati in eine eigene Relation auslagern

Und dazu noch eine m:n Beziehungsrelation.

Wäre es nicht besser, solange es sich nur um wenige Stati handelt, diese in einem Int Feld der Tabelle zu halten und dann über Bit-Operationen auzuwerten?

Status1 = 1
Status2 = 2
Status3 = 4
Status4 = 8

dann spart man sich eine Zusatztabelle. Natürlich nur wenn es garanitiert ist das es maximal 32 Stati geben wird.

mkinzler 2. Mai 2008 10:59

Re: Welches Format für Datensatzstatus
 
Dann müsste man aber die Bimuster wieder auseinanderfieseln

Sharky 2. Mai 2008 11:08

Re: Welches Format für Datensatzstatus
 
Zitat:

Zitat von mkinzler
Dann müsste man aber die Bimuster wieder auseinanderfieseln

Hai,

das finde ich jetzt aber nicht so problematisch.

So oder so muss man ja sagen was man möchte. Und wenn es über die Bitmuster machbar ist spart er sich zwei Tabellen welche ja verknüpft werden müssen und darum wieder den Server belasten.

Oder denke ich eben (habe Urlaub) total falsch? ;-)

tomsel 2. Mai 2008 11:09

Re: Welches Format für Datensatzstatus
 
Zitat:

Dann müsste man aber die Bimuster wieder auseinanderfieseln
"Bimuster" :gruebel:

MySQL unterstützt doch Bitoperationen (?), also ... warum nicht?

DeddyH 2. Mai 2008 11:10

Re: Welches Format für Datensatzstatus
 
Hai, Sharky, das Problem sehe ich weniger beim Prüfen einzelner Bits auf dem Client, als vielmehr beim Formulieren von Abfragen.

Jelly 2. Mai 2008 11:11

Re: Welches Format für Datensatzstatus
 
Zitat:

Zitat von Sharky
Wäre es nicht besser, solange es sich nur um wenige Stati handelt, diese in einem Int Feld der Tabelle zu halten und dann über Bit-Operationen auzuwerten?

Das spart zwar 2 Zusatztabellen, erschwert aber erheblich Anpassungen an den Daten. Was, wenn morgen ein Status dazukommt. Oder nicht mehr existiert?

Bedenken gibts auch, wenn du Abfrage über ein Status machen willst. Da kommst du um Bitoperationen nicht rum, d.h. es werden Operatoren odes Funktionen in SQL Statements vorkommen, und die machen dir die Indizierung auf das Statusfeld zunichte.

Ich hatte mal vor einiger Zeit gleiches zu bewältigen, und hatte auch diese Idee. Hab sie aber aus genannten Gründen schnell wieder über Bord geschmissen, und hoffe sie lagert jetzt irgendwo ganz tief im Mariaanengraben :mrgreen:

tomsel 2. Mai 2008 11:12

Re: Welches Format für Datensatzstatus
 
SQL-Code:
 select dings from bums where (status & 2) = 2
... oder so in etwa








äähh, ja, das problem kiegt wo anders :stupid:

mkinzler 2. Mai 2008 11:16

Re: Welches Format für Datensatzstatus
 
Zitat:

"Bimuster" Grübelnd...
Wer hat mir den t geklaut... :stupid:
natürlich kann man es auch so machen, ich würde aber die Lösung mit den extra Tabellen wählen.

Jelly 2. Mai 2008 11:20

Re: Welches Format für Datensatzstatus
 
Noch eine Ergänzung: Was ist mit der Datenkonsistenz... Wie willst du einschränken, dass plötzlich der Status 3172 irgendwo gesetzt wird.

MySQL ist doch ein relationales DBMS. Dann sollte man es auch relational nutzen. Weil es sich in der Statustabelle ja wohl um +/- 3 Einträge handelt, friesst ein Join auf diese Tabelle kein Brot.

guidok 2. Mai 2008 12:31

Re: Welches Format für Datensatzstatus
 
Zitat:

Zitat von mkinzler
Ich würde die Stati in eine eigene Relation auslagern

Das soll wohl heißen:

Tabelle A ist die Tabelle mit den importierten Daten, und Tabelle A_Status enthält die Einträge mit den Statusinformationen, z.B.

A.ID (Primarykey)
A.xxx

A_Status.AID
A_Status.Statusinfo



Habe ich das richtig verstanden?

Jelly 2. Mai 2008 12:37

Re: Welches Format für Datensatzstatus
 
Zitat:

Zitat von guidok
Habe ich das richtig verstanden?

Du bruchst auf jeden Fall 3 Tabellen. Deine eigentliche Daten (Import), eine Status Tabelle mit den 3 Records deiner Statusse... Und dann natürlich die CrossReference Tabelle, welche dir die m:n Beziehung zwsichen importiertem Datensatz und dem Status gibt.

guidok 9. Mai 2008 09:02

Re: Welches Format für Datensatzstatus
 
Also gut, ich habe jetzt drei Tabellen:

Import - ID, weitere Felder

Import_Status - ID, STATUS

Import_XStatus - Import_ID, Import_Status_ID


Wie sieht jetzt eine SQL-Abfrage aus, welche die drei Tabellen verbindet?

z.B.

Alle Import_Status.STATUS zu einer gegebenen Import.ID

SQL-Code:
SELECT A.STATUS FROM Import_Status A
  ...???

marabu 9. Mai 2008 11:36

Re: Welches Format für Datensatzstatus
 
Hallo Guido,

MySQL bietet für deine Zwecke den Datentyp SET an:

SQL-Code:
CREATE TABLE Importe (ID INTEGER NOT NULL, Status SET('ANGL', 'INAK', 'LÖVM'));
ALTER TABLE Importe MODIFY Status SET('ANGL','INAK','LÖVM','TEST');
SELECT * FROM Importe WHERE FIND_IN_SET('INAK', Status);
UPDATE Importe SET Status = 'INAK,TEST' WHERE ID = 0;
Eine Lösung auf dieser Basis würde ich bevorzugen.

Freundliche Grüße

guidok 9. Mai 2008 12:24

Re: Welches Format für Datensatzstatus
 
Danke Marabu, das werde ich mir mal genauer anschauen.

bluesbear 9. Mai 2008 17:53

Re: Welches Format für Datensatzstatus
 
Öhm - jetzt mal ganz blöd gefragt: Wieso nicht einfach 3 Boolean Felder nehmen? :gruebel:

marabu 9. Mai 2008 19:56

Re: Welches Format für Datensatzstatus
 
Das kannst du auch so machen, aber du musst dann aufpassen, dass nicht eine Strukturänderung an der Tabelle (beim Hinzufügen weiterer Statuswerte) deinen Code bricht.

bluesbear 9. Mai 2008 20:02

Re: Welches Format für Datensatzstatus
 
Hinzufügen ist die einfachste Variante.
Bestehende Felder verändern ist problematisch.
Aber für diesen Firlefanz gleich 2 neue Tabellen anlegen, mit einer m:n Struktur???
Joh heiligs Blechle!
Pimp my Database.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz