Verwaltung partitionierter Werte und ihrer Namen Enum (Java) vs DB

Bei der Entwicklung eines Systems Es gibt viele Fälle, in denen Sie den Teilungswert mit seiner Bedeutung verknüpfen möchten, z. B. "1: männlich, 2: weiblich", "A: ausgezeichnet B: gut C: akzeptabel D: nein". Es gibt auch viele Fälle, in denen Sie einen Teilungswert in eine Zeichenfolge konvertieren möchten.

Dieses Mal möchte ich die Methode mit Java Enum und die Methode zum Speichern in der Mastertabelle der DB vergleichen.

Es wird davon ausgegangen, dass Java als Sprache und MySQL als Datenbank verwendet wird.

1. Aufzählungsklasse

In Java5 und höher gibt es das Konzept des Aufzählungstyps. Effektives Java empfiehlt außerdem, es als Konstante zu verwenden.

Definieren Sie zunächst die folgende Encoder-Schnittstelle.

Encoder-Schnittstelle


/**
 *Encoder-Schnittstelle für Enum
 *
 * @param <T>Aufzählung Definition
 */
public interface Encodable<T extends Serializable> {
    /**
     *Encoder
     *
     * @Enum-Definition zurückgeben
     */
    T getCode();

    /**
     *Gibt den Namen des Codes zurück.
     *
     * @Name zurückgeben
     */
    String getName();
}

Um eine Zeichenfolge aus den Indikatorwerten zu generieren, definieren Sie die Decoderklasse wie folgt:

Decoder-Klasse


/**
 *Decoderklasse für Enum
 *
 * @param <K>Codewert
 * @param <V>Wert
 */
public class Decoder<K extends Serializable, V extends Encodable<K>> {

    /**Kartendefinition*/
    private Map<K, V> map;

    /**
     *Decoder
     *
     * @Parameterwerte Aufzählungsgruppe
     */
    private Decoder(V[] values) {
        map = new HashMap<K, V>(values.length);

        for (V value : values) {
            V old = map.put(value.getCode(), value);

            //Unterstützt keine doppelten Codewerte
            if (old != null) {
                throw new IllegalArgumentException("duplicated code: " + value);
            }
        }
    }

    /**
     *Decoder
     *
     * @Parametercode Codewert
     * @Enum-Klasse zurückgeben
     */
    public V decode(K code) {
        return map.get(code);
    }

    /**
     *Definition, um die Angabe des Typarguments wegzulassen
     *
     * @param <L>Codewert
     * @param <W>Wert
     * @Parameterwerte Aufzählungsgruppe
     * @Rückgabecoder
     */
    public static <L extends Serializable, W extends Encodable<L>> Decoder<L, W> create(W[] values) {
        return new Decoder<L, W>(values);
    }
}

Die eigentliche Klasse sieht folgendermaßen aus: Im Fall des Geschlechts wird es wie folgt sein.

Geschlechtsaufzählungsklasse


/**
 *Geschlechtsaufzählungsklasse.
 * 
 */
public enum Gender implements
                     Encodable<Integer> {

    /**Mann*/
    MALE(1, "Mann"),
    /**Frau*/
    FEMALE(2, "Frau");

    /**Decoder*/
    private static final Decoder<Integer, Gender> DECODER = Decoder.create(values());

    /**Codewert*/
    private final Integer code;

    /**Name*/
    private final String name;

    /**
     *Konstrukteur.
     * 
     * @Parametercode Codewert
     * @Param Name Name
     */
    private Gender(Integer code, String name) {
        this.code = code;
        this.name = name;
    }

    @Override
    public Integer getCode() {
        return code;
    }

    /**
     *Ruft die Enum-Klasse aus dem Codewert ab.
     * 
     * @Parametercode Codewert
     * @Rückgabe Belegformat Enum-Klasse
     */
    public static Gender decode(Integer code) {
        return DECODER.decode(code);
    }

    /**
     *Methode, um den Namen zu erhalten.
     * 
     * @Name zurückgeben
     */
    public String getName() {
        return name;
    }
}

Sie können den Namen mit der Decodierungsklasse und der getName-Methode wie unten gezeigt abrufen.

Anwendungsbeispiel


// 1:männlich
Gender male = Gender.decode(1);
String name = male.getName();

verdienen

Hohe Wartbarkeit

Wenn Sie es in das Programm schreiben und ihm einen aussagekräftigen Klassennamen geben, ist es gut lesbar und wartbar. Der Code ist einfach zu pflegen.

Einfach zu schreibende Logik

Sie können den Abteilungsnamen abrufen, ohne nacheinander eine Verbindung zur Datenbank herzustellen, sodass die Verarbeitung einfach ist.

Fehler

Es ist nicht einfach, einen Teilungswert hinzuzufügen oder den Namen zu ändern

Wenn ein Teilungswert hinzugefügt oder ein Name aufgrund einer Spezifikationsänderung usw. geändert wird, erfolgt eine Programmänderung und es werden auch Freigabearbeiten durchgeführt.

Wann zu verwenden

Ich denke, es ist eine gute Idee, Enum zu verwenden, um Dinge zu verwalten, die nicht geändert werden können, wie Geschlecht und Präfekturen in Japan. Wenn es sich ändert, ist es meiner Meinung nach oft notwendig, die Logik zu ändern.

2. DB-Mastertabelle

Es ist so, als würden Sie IDs und ihre Namen mithilfe einer Mastertabelle wie der folgenden verwalten. Natürlich ist es möglich, zusätzlich zum Namen zusätzliche Informationen einzugeben.

Login User Master


CREATE TABLE login_user_mst (
    id VARCHAR(11) NOT NULL,
    password CHAR(40) NOT NULL comment 'Passwort',
    name VARCHAR(255) NOT NULL comment 'Vollständiger Name',
    name_kana VARCHAR(255) default NULL comment 'Nennen Sie Kana',

    PRIMARY KEY(id)
) CHARACTER SET 'utf8'
  COMMENT 'Benutzer anmelden';

Datenbeispiel

id password name name_kana
10000001 xxxxxxxxxxxxxx Suzuki Nanako Suzuki Nanako
10000002 xxxxxxxxxxxxxx Matsumoto Kazuo Matsumoto Kazuo
10000003 xxxxxxxxxxxxxx Taku Watanabe Watanabe Taku

verdienen

Einfach den Namen zu ändern

Um den Namen des Partitionswerts zu ändern, aktualisieren Sie einfach den DB-Datensatz Die Kosten sind recht gering, da sie ohne Programmänderungen geändert werden können.

Sie können den Abteilungsnamen durch Tabellenverknüpfung erhalten

Da Sie der Mastertabelle beitreten und den Namen nur mit SQL erhalten können, Sie benötigen lediglich die Logik, das SQL-Ergebnis auf dem Bildschirm anzuzeigen oder an CSV auszugeben.

Fehler

Die Verzweigungsverarbeitung nach Divisionswert hat keine Bedeutung

Wenn beispielsweise ein Prozesszweig in Abhängigkeit vom Teilungswert auftritt, Weil es keine andere Wahl gibt, als diesen Klassifizierungswert auf der Anwendungsseite zu haben Selbst wenn Sie einen Wert in der Datenbank haben, befindet sich dieser in einem doppelten Wartungsstatus.

Schwierig zu verwalten, wenn die Anzahl der Tabellen zunimmt

Wenn das Projekt die Regel hat, dass "alle Konstanten in der Mastertabelle verwaltet werden", Wenn es viele Arten von Konstanten gibt und Sie für jede Konstante eine Tabelle erstellen, wird eine große Anzahl von Mastertabellen erstellt. Wenn es sich um eine Mastertabelle handelt, ist es meiner Meinung nach immer noch einfach zu verwalten, wenn eine Regel wie das Präfix "mst_" vorhanden ist. ..

Wann zu verwenden

Verwaltung angemeldeter Benutzer, Informationen zum Verkaufsbüro, Ich denke, dass es gut ist, es für Dinge zu verwenden, die in vielen Fällen relativ verändert sind.

Am Ende

Ich denke, dass es (ewig) eine ewige Frage ist, wie man den Teilungswert und den Namen verwaltet. In meinem aktuellen Projekt verwende ich sowohl den Aufzählungstyp als auch den DB-Master. Ich denke, Sie sollten jedes Merkmal verstehen und verwenden.

Recommended Posts

Verwaltung partitionierter Werte und ihrer Namen Enum (Java) vs DB
[Java] [Kotlin] Rufen Sie valueOf und Werte von Enum generisch auf
Subtrahieren Sie Enum-Konstanten von Zeichenfolgen und Werten in Java zurück
Vor- und Nachteile von Java
Über Biocontainer fastqc und Java
Java-Argumente, Rückgabewerte und Überladungen