DefaultWert für ein bestimmtes Feld definieren

bastienne

Benutzer
Beiträge
6
Ich habe diese beiden Tabellen:

Application

Id (PK)identity
Name (UniqueKey)

Language
Id (PK)identity
IsoCode(UniqueKey)
ApplicationId(FK)

IST:

Eine Anwendung kann viele Sprachen haben.
Es ist ausreichend, wenn für eine andere Anwendung nochmals eine bestimmte Sprache erzeugt wird.
Eine N:M Beziehung benötige ich hier nicht.

SOLL:

Eine Anwendung benötigt aber eine Sprache die als Default markiert ist z.B. en/de bei uns in der Firma.

Folgendes könnte ich mir vorstellen, aber beides mag ich irgendwie nicht:

Language.IsDefaultLanguage (bool)

Oder

Application.DefaultLanguageId (Ist die Id(PK) von der Language Tabelle)

Logik in der Anwendung:

Wenn eine Anwendung erzeugt wird, dann MUSS auch gleich eine Language als Default angelegt werden

Wie würdet Ihr das machen?
 
Werbung:
Check, daß es nur eine Default-Sprache gibt:

Code:
test=*# create table language (id int primary key, app int, language int, default_language bool);
CREATE TABLE
Time: 28,533 ms
test=*# create unique index on language (app, default_language) where default_language;
CREATE INDEX
Time: 3,062 ms
test=*# insert into language values (1, 1, 1, true);
INSERT 0 1
Time: 0,508 ms
test=*# insert into language values (2, 1, 2, false);
INSERT 0 1
Time: 0,250 ms
test=*# insert into language values (3, 1, 3, false);
INSERT 0 1
Time: 0,192 ms
test=*# insert into language values (4, 1, 4, true);
ERROR:  duplicate key value violates unique constraint "language_app_default_language_idx"
DETAIL:  Key (app, default_language)=(1, t) already exists.
Time: 0,325 ms

Ein Check, daß es je app eine Default-Sprache gibt wäre etwas komplizierter, da wird man wohl einen per-Statement-TRIGGER nehmen müssen.
 
Ein Check, daß es je app eine Default-Sprache gibt wäre etwas komplizierter, da wird man wohl einen per-Statement-TRIGGER nehmen müssen.[/QUOTE]

Ich darf/kann keine SP oder Trigger benutzen. Wir benutzen ein ORM Tool.

Dass es eine Default Sprache gibt wird die Aufgabe meiner Software sein, wenn eine "Application" erzeugt wird, hierbei MUSS auch eine Language mit TRUE erzeugt werden.

Mir geht es hauptsächlich darum, ob das vorgehen mit der bool DefaultLanguage Spalte richtig ist, denn es wäre doch geschickter (weniger Daten) die LanguageId (Default) in die Application reinzuschreiben als MussFeld, dadurch kann man keine Application einfügen ohne diese LanguageId.

Was meinst Du?
 
Ne... die LanguageId in Application.DefaultLanguageId hineinzuschreiben geht nicht, da ich die languageId erst habe, wenn ich eine Application erzeugt habe, das ist ein Henne-Ei-Problem. Also nehme ich doch die boolsche Spalte mit unique constraint.
 
@akretschmer Du schreibst:"test=*# create unique index on language (app, default_language) where default_language;"

Das setzt einen Index auf ApplicationId und IsDefaultProperty. Das macht meine bisherige Logik/Index kaputt, der auf ApplicationId/IsoCode(Language) geht. Mit deinem Index kann ich für die gleiche Anwendung mehrere gleiche Sprachen abspeichern, das darf aber nicht sein.

Den Index auf AppId/IsoCode/IsDefaultLanguage geht aber auch nicht?? Da kann ich 2x True für IsDefaultLanguage speichern.

Hast Du eine Idee?
 
Mein Index ist ein Unique Index auf den 2 Spalten app und default_language, der aber partiell ist: nur auf den Datensätzen, wo default_language TRUE ist (ist ja ein BOOL-Feld). Damit erzwinge ich, daß es je app nur ein Datensatz geben darf, wo default_language auf TRUE steht. Beim Versuch, für app=1 einen weiteren Datensatz mit default_language einzutragen bekomme ich ja dann auch glaskar den Fehler.

Ich weiß nicht, ob solche Indexe (partielle Indexe) in M$SQL unterstützt werden, sorry. Ich verwende PostgreSQL, das kann geringfügig mehr als viele andere Systeme ...
 
Werbung:
Zurück
Oben