BEGIN; -- Organisationseinheiten (OEs): Baum pro Organisation, ein Geraet gehoert zu -- genau einer OE. "Neue Geraete" ist pro Organisation die einzige Zeile mit -- ist_standard=true - Landeplatz fuer neu aktivierte Geraete, geschuetzt vor -- Loeschen (siehe app.py). parent_id = NULL heisst "oberste Ebene direkt -- unter der Organisation" - kein eigener Wurzel-Datensatz noetig, die -- Organisation selbst ist implizit die Wurzel. CREATE TABLE organisationseinheiten ( id UUID PRIMARY KEY, organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE, parent_id UUID REFERENCES organisationseinheiten(id) ON DELETE RESTRICT, name TEXT NOT NULL, ist_standard BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE (organization_id, parent_id, name) ); CREATE UNIQUE INDEX organisationseinheiten_one_standard_per_org ON organisationseinheiten (organization_id) WHERE ist_standard; -- Nullable hier: bestehende Geraete brauchen erst einen Backfill -- (scripts/backfill_organisationseinheiten.py), bevor NOT NULL erzwungen -- werden kann (siehe Migration 0019). ALTER TABLE devices ADD COLUMN oe_id UUID REFERENCES organisationseinheiten(id) ON DELETE RESTRICT; -- Gruppen: flach (keine Verschachtelung), ein Geraet kann in mehreren -- gleichzeitig sein (device_gruppen als M:N). CREATE TABLE gruppen ( id UUID PRIMARY KEY, organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE, name TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE (organization_id, name) ); CREATE TABLE device_gruppen ( device_id UUID NOT NULL REFERENCES devices(id) ON DELETE CASCADE, gruppe_id UUID NOT NULL REFERENCES gruppen(id) ON DELETE CASCADE, PRIMARY KEY (device_id, gruppe_id) ); -- Sparsame Merkmal-Overrides je OE/Gruppe, gleiches Muster wie -- device_merkmale (0007_auftragskatalog.sql): nur eine Zeile, wenn diese -- OE/Gruppe tatsaechlich eine explizite Meinung zu diesem Merkmal hat. CREATE TABLE oe_merkmale ( oe_id UUID NOT NULL REFERENCES organisationseinheiten(id) ON DELETE CASCADE, merkmal_id UUID NOT NULL REFERENCES merkmale(id) ON DELETE RESTRICT, aktiv BOOLEAN NOT NULL, optionen JSONB NOT NULL DEFAULT '{}'::jsonb, PRIMARY KEY (oe_id, merkmal_id) ); CREATE TABLE gruppen_merkmale ( gruppe_id UUID NOT NULL REFERENCES gruppen(id) ON DELETE CASCADE, merkmal_id UUID NOT NULL REFERENCES merkmale(id) ON DELETE RESTRICT, aktiv BOOLEAN NOT NULL, optionen JSONB NOT NULL DEFAULT '{}'::jsonb, PRIMARY KEY (gruppe_id, merkmal_id) ); COMMIT;