![]() |
Datenbank: beliebig • Version: beliebig • Zugriff über: beliebig
Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Hallo zusammen,
ich hoffe mal, dass der Titel so halbwegs das beschreibt, um was es geht, da sich das (für mich) nur sehr schwer in wenigen Worten beschreiben lässt. Und zwar habe ich im Moment das Problem, dass ein Datensatz mehrere verschiedene Zustände haben kann. Diese Zustände müssen in einer Historie fortgeschrieben werden, d.h. es darf kein Zustand ausgelassen werden. Daher habe ich eine Tabelle Order und eine OrderState. In der OrderState sind weitere Informationen zum Status gespeichert, u.A. den Erzeugungszeitstempel. Je nach Status müssen zusätzliche Informationen gespeichert werden, d.h. ist der Status "offen", so müssen die Attribute A, B und C gesetzt sein, ist der Status "geschlossen", so müssen X, Y und Z geschrieben werden. Ich sehe hier folgende beiden Lösungen:
|
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Ich würde vermutlich wg Komplexität und Performance die erste Variante nehmen. Defacto mache ich das in ähnlichen Szenarien. Ob da ein not null oder so dabei ist, geschenkt. Sollte mit den gängigen db per Constraint statusabhängig abzusichern sein.
Trigger finde ich intransparent, am besten nur für ID oder so. Vielleicht hilft es, update, insert, delete zu unterbinden und statt dessen nur eine SP zu erlauben / nutzen, die die Operationen (Statuswechsel/Lifecycle) ermöglicht. Todsicher wird es, wenn niemand als AppOwner/Schema User Daten verarbeitet, so dass die Berechtigung auf Update/Insert/Delete versus SP voll greift. P.S.: In einer Mehrschichtanwendung kannst Du den Zugriff auf die SP sowieso vorgeben. |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Zitat:
Du könntest auch nur die speziellen Zustände als Tabelle speichern (und die allgemeinen Informationen wenn nötig über einen View zusammentragen). Siehe auch: ![]() |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Meiner Meinung nach spricht für mehrere Tabellen, nur die Möglichkeit Berechtigungen zu vergeben.Quatsch das kann man über Views genauso erschlagen.
Gruß K-H |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Ich möchte hier mal den Begriff CQRS in die Runde werfen. Soweit ich das verstanden habe, werden hier genau solche Übergänge gespeichert. Hier ist mal ein kleines Beispiel (allerdings in C#):
![]() Der eigentliche Witz daran ist, dass die sog. Events als auch ein ReadModel gespeichert wird. Die Events sind z.B. CustomerCreatedEvent. In diesen Events kann dann alles gespeichert werden, was mal interessant sein könnte (wer wars, wann, usw). Das ReadModel kann jederzeit wieder komplett aus diesen Events erneut hergestellt werden. Davon abgesehen bekommt man ein Audit direkt mitgeliefert. ![]() Gruß schlecki |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Du möchstest eine klassisches Datastore zusammen mit den Produktivdaten speichern.
Unterteile die Aufgabe in: Auftragshistorie und aktueller Zustand des Auftrags. Um die Historie zu modellieren, überlegst Du dir, welche Fragen (=Queries) du beantwortet haben möchtest und bastelst Dir dann die Tabelle so, das die Frage effektiv beantwortet wird. |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Aus dem Bauch heraus hätte ich gesagt, eine Tabelle mit den Zuständen und allen zustandsspezifischen Felder. Kommt ein neuer Zustand hinzu, musst halt neue Felder hinzufügen, sonst halt gleich mal eine neue Tabelle. Da du im Code vermutlich eh auf eine unterschiedliche Logik je Zustand eingehen wirst müssen, kannst dort dann auf die entsprechenden Felder zugreifen. DB-seitig hätte ich die gültigen Kombinationen aus Zustand und zustandsspezifischen Daten über einen Constraint sichergestellt. Mit dem Constraint läuft man dann halt ev. in das Problem, dass der Constraint DB-seitig geändert werden muss, wenn sich in der Logik etwas ändert. Hier ist halt die Frage, ob sich mehrere Applikationen diese Datenbank teilen oder ob jemand mit einem SQL-Tool direkt draufgehen kann und dort dann Änderungen vornimmt, die die Anwendung dann nicht mehr verarbeiten kann etc. Ist schnell mal eine Glaubensfrage und wahrscheinlich stellt sich später heraus, dass es anders besser gewesen wäre. :-D
|
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Dass es auf eine Art "Glaubensfrage" hinaus läuft ist mir schon irgendwie klar. Genau deswegen höre ich mir ganz gerne immer andere Meinungen an und entscheide dann, was sinnvoller ist ;) Eine perfekte Lösung scheint es dafür ja nicht unbedingt zu geben, wie mir bei meiner eigenen Argumentation schon aufgefallen ist. Jedes Design hat eben seine Vor- und Nachteile.
Das mit den Constraints hatte ich so noch nie genutzt. Werde daher wohl eher auf eine Tabelle ausweichen und damit mal hantieren. |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
@schlecki
ich darf mich jeden Tag mit "Event-Tabellen" auseinander setzen. Was in der Theorie elegant und vernünftig scheint, ist in der Praxis, vor allem wenn rale Menschen z.B. über die Auswahl eines Events entscheiden nur knapp vom Chaos entfernt. Zum einen "verklickt" man sich gerne bei der Auswahl, zum anderen hat jeder Benutzer seine eigene Philosopie, wie Daten zu erfassen sind. Und wenn man darauf hinweist, das das falsche Event gewählt wurde kommt als Antwort: "ich seh doch alles auf dem Bildschirm" Gruß K-H |
AW: Von Flag abhängige Informationen/Tabellen innerhalb eines DB-Designs
Der Benutzer kann ja nicht direkt ein Event auswählen. Er wählt z.B. "Kundenadresse ändern", ändert diese. Intern wird dann dieses Event erzeugt und gespeichert - damit man es auch wieder performant lesen kann, wird es direkt in ein ReadModel übersetzt (also hier wieder in einen Kundendatensatz mit der aktuellen Adresse).
Welche Events da nun wie gespeichert sind, ist ja eigt. nur für eine Historie interessant - oder wenn man das ReadModel neu aufbauen will/muss. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz