Status in einer Datenbank speichern

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Hi,

angenommen es gibt als Status : gelöscht, inaktiv und aktiv

Sollte das eher in eine eigene Tabelle und dann per Fremdschlüssel verknüpft werden oder kann sowas alles in eine Tabelle wo dann jeweils das Wort in der Statusspalte drinsteht?
 
Das Wort selber wird gar nicht drinstehen, weil das ja überflüssig is. 0, 1, 2 und im Script/Programm dann Konstanten einsetzen. Alternativ den ENUM-Datentyp.
 
Hi,

wenn man den enum-Datentyp nimmt, dann kommen dort auch nur die Zahlen rein?

Ich würde jetzt gern über eine Selectbox jeweils nach Status filtern bzw. einen einzelnen Status erhalten. Die Zuweisung der Beschriftungen sind ja in jeder Funktion gleich. Kann man das irgendwie an einer Stelle unterbringen? (Ansonsten hätte ich einfach die Zusätzliche Tabelle in der Datenbank ausgelesen)

PHP:
define('AKTIV',1);
define('INAKTIV',2);
define('GELOESCHT',3);

function getStatus($id){
    switch($id){
        case INAKTIV:
            return 'inaktiv';
        break;

        case AKTIV:
            return 'aktiv';
        break;

    }
}

function getStatusForSelectbox(){
    return array(
        AKTIV => 'aktiv',
        INAKTIV => 'inaktiv',
        GELOESCHT => 'gelöscht'
    )
}
 
Lies dir mal die Doku zum ENUM-Datentyp durch. Die beantwortet deine Frage.

Wieso du unbedingt eine neue Tabelle einführen willst, werd ich wohl nicht verstehen :hö: Das bringt null, kostet mehr Speicher (der ENUM braucht 2 Bits -> 1 Byte; neue Tabelle mit Fremdschlüssel kostet je nach Type des PRIMARY KEYs 4 Bytes und nach oben ohne Limit) und verursacht einen zusätzlichen JOIN, der immer notwendig wird.
 
Hi,

ich will ja nicht unbedingt eine neue Tabelle enführen. Deine Argumente sehe ich ein, und mit den Konstanten lässt sich das gut machen :)
 
Zuletzt bearbeitet:
Da hab ich wohl zu früh abgeschickt :)

Bei ENUM gibts also den Wert und einen Index.

Dann hätte ich noch die Frage für das Erstellen der Selectbox. Dort müssen ja alle Werte rein. Die bekomme ich ja nur durch die Abfrage auf die Tabelle mittels GROUP BY oder DISTINCT. Oder sollte man das anders lösen?
 
Fest rein! Was macht deine Select-Box, wenn die DB leer is oder kein Datensatz diesen Status hat?

Es sei denn natürlich, du willst nur Werte anzeigen, die mindestens ein Vorkommen haben. Dann DISTINCT-Abfrage, welche Werte da sind.
 
Es sollten schon immer alle Werte in der Selectbox stehen, egal ob es dazu Datensätze gibt oder nicht.

Schreibe ich es fest rein, dann muss man natürlich darauf achten, das die Werte in der ENUM-Spalte gleich den in der Selectbox sind.
 
Normalerweise ist das DB-Design ja fest, d.h. du weißt zum Erstellungszeitpunkt der Anwendung, welche Werte der ENUM-Datentyp hat.

Arbeitest du natürlich so schlampig, dass du im Nachhinein das DB-Design änderst, müsstest du auch die Anwendung anpassen. Abhilfe schafft hier, wenn du es eh schon weißt, dass du eben jedes Mal den Tabellenentwurf einliest und somit wirklich alle möglichen Werte immer wieder holst. Gute Programmierung is das aber nicht. Aber möglich.
 
Ich bin jetzt davon ausgegangen (auch wenn man vorher alle Werte weiß), das ja in Zukunft noch ein anderer Status hinzukommen kann (oder mehrere)
 
Das kann - wenn man ordentlich arbeitet - nicht passieren! Wenn du das machst, würde ich eben die Anwendung entsprechend anpassen. Musst du ja eh, weil den neuen Wert muss ja auch irgendwer schreiben oder wird die DB von Extern befüllt? - Klingt mir aber nicht so professionell :ugly:
 
Öhm, warum kann das nicht passieren?
Angenommen man nimmt den Lieferstatus und nach 6 Monaten fällt dem Shop ein, wir brauchen einen neuen Lieferstatus. Dann muss der mit hinzugefügt werden. Wieso hat man dann nicht orfentlich gearbeitet?

Die DB wird nicht extern befüllt. Man müsste dann wie du schon gesaht hast den Wert in die DB schreiben und zusätzlich in die Funktion, wo ja alle Werte fest drin stehen.
 
Es ging mir primär auch nur darum, das man immer an 2 Sachen denkt, wo man Änderungen durchführen muss und nicht 1 Stelle vergisst.