Chrisi: Vor u. Nachteile ENUM()

Hallo zusammen,

ich habe eine kleinere Entscheidung vor mir und bitte euch um euren Rat :)

Wie steht ihr zum Einsatz von ENUM Spalten ? Ich frage mich ob es ein Fehler ist bzw. ob es Nachteile für mich bringen kann wenn ich diverse Spalten auf ENUM umstelle ...

Ich denke dabei besonders an Statuspalten die z.B. den Status eines Forenusers festlegen (inactive,active,closed,was auch immer).

Im Moment löse ich das ganze über SMALLINT mit Werten von 1-3, so hat in diesem Fall jeweils die Zahl die von mir gedachte Auswirkung.

Leider stelle ich immer öfter fest das ich nach geraumer Zeit bei manchen Projekten meine eigenen Statusspalten nur schwer wieder zurordnen kann ... (Was hatte den hier nochmal die 2 zu bedeuten ?)

Daher wäre für mich eine ENUM Spalte mit klarer Textaussage (inactive,active,closed) vieleicht besser.

Stören tut mich aber das ich dann bei der Prüfung der Rechte immer die Strings im php Code vergleichen muss, hier wäre es perfekt wenn man auch den Index selecten könnte, habe aber keine Infos dazu gefunden.

Könnt ihr mir da vieleicht sagen wie ihr das ganze angeht und ob es sinnvoll ist eine ENUM als Status/Rechte Splate einzusetzen ?

Danke und viele Grüße, Chrisi ...

  1. Hallo,

    lege für jede solche smallint spalte einen "lookup" table mit
      id und beschreibung an.
      (so würde ich es machen).

    gruss

    --
    no strict;
    no warnings;
    Ich weiss es nicht, aber ich bin mir nicht sicher.
    Craptastic.
    1. Hi,

      danke für deine Antwort.

      ich glaube in meinem Fall würden es zu viele lookups werden :) Ich habe ca. 5 betroffene Tabellen mit verschiedenen Status und Rechte Optionen, dass wären dann 5 weitere Tabellen mit lookups ...

      Wobei meine lookuptables dann dem Index einer ENUM Splate sehr ähneln würden:

      SID  status
      -------------
      1    inactive
      2    active
      3    closed

      .. Chrisi

      Ps.: Ich arbeite im Mom mit einer MySQL Datenbank habe vergessen das in meinem ersten Posting zu erwähnen.

  2. Hello,

    Daher wäre für mich eine ENUM Spalte mit klarer Textaussage (inactive,active,closed) vieleicht besser.

    Enum hat in MySQL eine Macke. Bei Set bin ich mir im Moment nicht sicher.

    Eien ENUM-Spalte sollte keine numerischen Werte enthalten, sondern nur Strings. Wenn man nämlich einen numereischen Wert aufruft, der als String nicht in den Defults enthalten ist, aber als Index, nimmt PHP diesen. Das ist dann leider aber nicht der Wert, den man haben wollte...

    Ich habe zwar selber einige Funktionen dafür geschrieben, mit Enums und Sets bequem unzugehen, halte es aber auch für sinnvoller, hierfür eine eigene Tabelle anzulegen.

    Es gab auch MySQL-Versionen, ber denen man später keine Änderungen mehr an den Defaults vornehmen konnte, ohne die Daten zu zerstören.

    Wenn es andere Datenbanken betrifft, kann man allerdings ähnliche Lösungen meistens bedenkenlos nutzen, ohne später Probleme zu bekommen. Aber auch hier gilt: Die "Eins aus M" und "N aus M"- Spalten sollte man nur dann "fest verdrahten", wenn es sich dabei um einen begrenzten Weertevorrat handelt, der sich während der Lebensdauer des Programmes (der Datenbank) nicht mehr (wesentlich) verändern wird. Nachschlagelisten mit einer (hohen) Dynamic sollte _immer_ als eigene Tabelle angelegt werden.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi Tom,

      Die Sache mit dem Ändern von Werten ist mir gerade auch auf den Kecks gegangen.

      Ich dachte mir ich könne ja einfach mal die default ENUM Werte von Deutsch auf Englisch übersetzen, weil die nette Spalte ja mit einem Index Arbeitet:

      aktiv -> active u.s.w..

      aber das war nicht gut :) Er ersetzt, bzw. schreibt die bestehenden alten Werte nicht um und zerstört damit die Daten ... MySQL 4.1.12 :)

      Damit ist das Thema ENUM für Statuspalten wohl für mich erledigt ...

      Dann werde ich wohl an einigen Stellen "lookup" Tables anlegen oder evtl. externe Arrays in der Config Datei mit den notwedingen Daten füttern ... Oder noch einfacher: Ich notiere mir einfach mal was ich da gemacht habe :)

      Viele Grüße, Chrisi...

    2. Hello,

      Eien ENUM-Spalte sollte keine numerischen Werte enthalten, sondern nur Strings. Wenn man nämlich einen numereischen Wert aufruft, der als String nicht in den Defults enthalten ist, aber als Index, nimmt PHP diesen. Das ist dann leider aber nicht der Wert, den man haben wollte...

      sollte natürlich heißen: ... nimmt MySQL diesen

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau