_hkl: Exklusive alternative 1:n Relationen / SQL u. OOP

Beitrag lesen

Hallo !

Ich arbeite an einer >3-Schichten Architektur zur Modellierung bestimmter Geschaeftsprozesse.

Die zugehörige Datenbank ist in mehrere Bereiche gegliedert.

Im Zentruum des Modells steht eine Tablle "Situationen" (S)

Ohne zeitliche Dimension
------------------------

  • Bereich Benutzer
  • Bereich Metriken
  • Bereich Bewertungen
  • Bereich Massnahmen
      - Tabelle Interne Massnahmen (I) - beziehen sich 1:n auf S
      - Tabelle Externe Massnahmen (E) - beziehen sich 1:n auf S

Mit zeitlicher Dimension
------------------------

  • Bereich Agenda
      Tabelle Agenda (Ag)
      Tabelle Aktionen (A) - ein Feld mit Fremdschlüssel auf Agenda
                           - ein Feld mit Sequenznummer innerhalb der
                             Agenda

( Die Aktionen sind soweit granular dass sie tatsaechlich sequentiell
abgebildet werden koennen - Parallelisierung von Vorgaengen wird in darüberliegenden (Objekt-)Schichten progammatisch abgebildet. )

Das Problem liegt genau an der Schnittstelle zwischen ( situationsbezogenen ) Massnahmen und ( agendabezogenen ) Aktionen.

Eine Aktion soll in dieser Modellierung _entweder_ eine interne _oder_ eine externe Massnahme beinhalten koennen.
Also : zwei Fremdschlüsselfelder in A - eines für I, eines für E ?

Wie erzwinge ich dann aber dass genau ein FK NULL ist ?
( wg. des entweder-oder)

Da faellt mir nur ein Constraint ein -
das erscheint mir aber strukturell zu schwach.

=> Seht Ihr das anders ? <=

Es gibt oberhalb der Datenbank eine Schicht von Business-Objekten. Dort ist das sehr einfach abzufangen z.B. mit eine abstrakten Basisklasse "Massnahmen" und einer Referenz _auf_ _eine_ Massnahme in der Klasse "Aktionen" die alternativ mit einem I oder E Objekt versorgt wird.

Nur hat die Sache mehrere Haken:

Zur Zeit befindet sich das Projekt in der Phase einer Prototypisierung ( in Python 2.4 ) - es ist geplant das Projekt später sukzessive in C++ zu implementieren.

Deshalb will ich möglichst viel Business-Logik in die Datenbank ziehen.
Deren Struktur ist nämlich z.Zt die einzige echte Konstante die ich erkennen kann.

Auch soll die Wahl der Datenbank mit der das Produkt betrieben wird dem Kunden überlassen werden, deshalb würde ich das gerne so "SQL-rudimentaer" wie möglich abbilden.
Das kann man mit Triggern / SP / Contraints etc formulieren aber das erscheint mir semantisch zu "schwach".
Und ausserdem nur platform - sprich DB - abhängig zu formulieren.
Es gebietet sich doch eigentlich eine strukturelle Lösung, oder ?

=> Kann man die "A besteht entweder aus E oder I" Beziehung strukturell überhaupt in den Griff kriegen ? <=

Entweder versuch ich grad die Quadratur des Kreises oder ich seh den Wald vor lauter Bäumen nicht... ;-)

Vielen Dank fuer's Lesen !

Gruesse

hkl

P.S.:

Prototypisierungsplattform

  • Windows XP
  • MySQL 5.2 ( InnoDB Engine )
  • ggf. ODBC
  • Python 2.4
  • pywin32 build 205

P.P.S.: Das Ganze faellt vielleicht etwas aus dem Kernthema des Forums, aber die SQL-Thematik erschien mir ein hinreichendes gemeinsames Drittes zu sein.