DevCore.net

VIRTUAL Columns in MySQL: Berechnete Spalten ohne Speicher

Statt berechnete Werte im Code vorzubereiten oder redundant in der DB zu speichern, übernimmt MariaDB/MySQL das selbst:

-- Nachträglich zu einer bestehenden Tabelle hinzufügen
ALTER TABLE orders
  ADD COLUMN gross DECIMAL(10,2) AS (net * (1 + tax_rate)) VIRTUAL;

VIRTUAL bedeutet: kein eigener Speicherplatz – der Wert wird beim Lesen berechnet. Die Alternative STORED schreibt ihn physisch in die Tabelle.

Vorteil: Kein Trigger, kein App-Code, keine Synchronisations-Fehler – die Spalte ist immer korrekt.

Index: Nutzt du die VIRTUAL Column in einer WHERE-Bedingung, lohnt sich ein Index darauf – sonst muss MariaDB/MySQL den Ausdruck für jede Zeile im Scan berechnen:

ALTER TABLE orders ADD INDEX idx_gross (gross);

Der Unterschied ist dramatisch: Abfragen auf großen Tabellen fallen damit von mehreren Sekunden auf wenige Millisekunden – bei mir von 4 Sekunden auf 80 ms. Verwendest du die Spalte hingegen nur im SELECT, ist kein Index nötig: Der Ausdruck wird erst nach dem Filtern berechnet, also nur für die Zeilen, die bereits alle anderen Bedingungen passiert haben.

Nested CSS: So benutzt du es

Nested CSS nutzt du direkt im Eltern-Block mit & für States, Klassen und Elemente.

.card {
  padding: 1rem;
  border: 1px solid var(--border);

  & h2 {
    margin: 0 0 0.5rem;
  }

  &:hover {
    border-color: var(--accent);
  }

  &.is-featured {
    background: var(--surface-highlight);
  }

  @media (min-width: 48rem) {
    padding: 1.5rem;
  }
}

Damit bleiben Elemente, Hover-State und Responsive-Anpassung direkt an der Komponente.
In manchen Fällen wird damit SCSS für genau solche Verschachtelungen obsolet.

Guard Clauses: Weniger Verschachtelung, klarere Logik

Die Idee: Prüfe Ausnahmefälle zuerst und verlasse die Funktion sofort. So bleibt alles sauber.

// ❌ Tief verschachtelt
function createInvoice(?User $user, array $items) {
    if ($user) {
        if ($user->isActive()) {
            if ($items) {
                return Invoice::fromItems($user, $items);
            }
        }
    }

    return null;
}

// ✅ Guard Clauses
function createInvoice(?User $user, array $items) {
    if (!$user) {
        return null;
    }

    if (!$user->isActive()) {
        return null;
    }

    if (!$items) {
        return null;
    }

    return Invoice::fromItems($user, $items);
}

Vorteil: Weniger Einrückung, schneller erfassbar, leichter zu testen.

Honey Pot im Formular: Spam mit einem Feld vermeiden

Spam-Formulare kommen häufig automatisch zustande. Ein zusätzliches Feld, das Menschen nicht sehen (und Bots trotzdem ausfüllen), filtert gefühlt 98 % der Einsendungen, weil du die Verarbeitung sofort abbrichst, sobald das Feld Inhalt hat.

<input type="text" name="unused" aria-hidden="true" autocomplete="off" tabindex="-1" />
[name="unused"] { position: absolute; left: -9999px; }

Serverseitig reicht ein einfacher Check: läuft da was rein? Dann verwirfst du den Eintrag und sparst dir die komplexen „I’m not a robot“-Checkboxen, das JavaScript und externe APIs.

Eleventy: schlankes SSG bei voller Kontrolle

Eleventy ist das perfekte SSG, wenn du mit Markdown, Nunjucks oder HTML schreiben willst und dir der Build nicht im Weg stehen soll. Du legst ein paar Markdown-Dateien, packst deine Assets daneben und lässt Eleventy rendern. Layouts oder Includes kannst du dazuschalten, aber sie sind optional der ganze Ablauf bleibt minimal.

Probiere es in 2 Schritten aus:

echo "Hello World" > index.md
npx @11ty/eleventy