# Einschränkung möglicher Kombinationen



## Landei (1. Okt 2010)

Ich will unser recht kompliziertes Schichtsystem neu modellieren. 

Es gibt eine Tabelle "Schichtregime", die den Typ der Rotation festlegt (Vierschicht, Dreischicht, Tagschicht u.s.w.).

Dann gibt es eine Tabelle "Segment", das zu einem Regime die möglichen groben "Tagesschnippsel" auflistet (also für Vierschicht z.B. 4früh, 4spät und 4nacht, oder für Tagschicht eben nur Tag). 

Dann habe ich eine Tabelle "Rotation", dass die Schichtgruppen innerhalb eines Regimes definiert (Vierschicht hat etwa A4 bis D4, Dreischicht hat A3 bis C3, Tag hat nur Day). 

Danke, dass ihr bis hierher durchgehalten habt, denn jetzt kommt mein Problemkind: Die Tabelle "Calendar", die ein Datum, ein Segment und einen Rotation enthalten soll, also z.B. 01.01.2011, 4früh, B4 ("am 1.1. hat die Schichtgruppe B4 Frühschicht"). 

Wie kann ich nun sicherstellen, dass nur Segmente und Rotationen des gleichen Regimes kombiniert werden können? Sicher kann (und werde) ich das Programm entsprechend absichern, und ich könnte auch Trigger schreiben, aber wie sähe eine allgemeingültige, herstellerunabhängige und strukturelle SQL Lösung aus?


----------



## Marcinek (2. Okt 2010)

Solche restriktionen sind in sql nicht möglich.

Du könntest eine weitere Tabelle mit möglichen Kombinationen machen, aber meiner Meinung nach gehört das auf Fachlogik schicht.


----------



## Landei (2. Okt 2010)

Und ich dachte, ich bin nur zu blöd, sowas zu finden...


----------



## tuttle64 (5. Okt 2010)

Landei hat gesagt.:


> Und ich dachte, ich bin nur zu blöd, sowas zu finden...




was du beschreibst klingt nach referentieller integrität und hierzu gibt es z.B. in mysql die möglichkeit, auf ein tabellenattribut einen foreign key zu definieren und dann als referenz für die integrität eine tabelle sowie ein attribut anzugeben, welche die möglichen werte enthält. versucht man nun, im pk eine nicht-existierender wert einzufügen, erhält man ein "key constraint fails".


----------



## Landei (5. Okt 2010)

Nein, es ist komplizierter. Referentielle Integrität ist, wenn ich prüfe, ob eine Schichtgruppe, die ich in Calendar einfügen will, auch wirklich in der Tabelle Rotation existiert. Das mache ich natürlich. Was ich will ist testen, ob Schichtgruppe und Segment eines Calendar-Eintrags auch "zusammenpassen" (also die zusätzliche Bedingung Schichtgruppe.regime == Segment.regime erfüllt ist). Ich wüßte nicht, wie das mit Fremdschlüsseln zu realisieren wäre.


----------



## Gast2 (5. Okt 2010)

Wenn ihr eine Oracle verwendet könnte man sowas mit einem Function-Based Constraint realisieren:
Oracle tools tips - SQL Function Based Constraints - Symmetric Functions

Ob es sowas für andere RDBMS gibt weiß ich nicht. Musst du mal in die Doku schauen. Bei Postgres würd ich stark drauf tippen das es geht. Das wäre somit evtl keine "eine allgemeingültige, herstellerunabhängige und strukturelle SQL Lösung", vielleicht ist das aber auch ein Standard, hab mich nie mit anderen RDBMS auseinandergesetzt.


----------



## Landei (5. Okt 2010)

Interessant. Bei mir wäre es M$ SQL Server.


----------

