Laden...

Datenbank-Design: Wie beschreibe ich n Termine zu einer Person?

Erstellt von mapi vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.683 Views
M
mapi Themenstarter:in
10 Beiträge seit 2016
vor 8 Jahren
Datenbank-Design: Wie beschreibe ich n Termine zu einer Person?

verwendetes Datenbanksystem: <MySQL>
Programmiersprache: VB.NET Visual Studio 2012

Hallo ich erkläre euch kurz meine Situation:
Ich programmiere eine Patientenverwaltung für eine Arztpraxis.
Nun sollen zu jedem Patienten (rund 150) die Sitzungstermine gespeichert werden, und die Angabe ob sie abgeschlossen sind oder noch anstehen (CheckBox).
Das ganze könnte dann beispielsweise so aussehen (siehe Anhang).
Das Problem: Jeder Patient hat mindestens 1 höchstens n Sitzungen. Ein Patient kann theoretisch bis zu 200 Sitzungentermine oder mehr haben.

Ich habe bisher die Patienten in einer Datenbank gespeichert Tabelle Patienten mit den Spalten:
Nachname
Vorname
Geburtsdatum
Anschrift
Therapeut
Krankenkasse
Schulart
Diagnose

Nur wie speichere ich dazu jetzt die Sitzungstermine? Das können bis 200 verschiedene Datumswerte oder mehr sein, und sollte wohl kaum für jeden Termin eine neue Spalte hinzufügen oder? Dann kann meine Tabelle ja über 200 Spalten haben? Wie löse ich das am geschicktesten?

DANKE 👍 👍

MfG Mapi

S
45 Beiträge seit 2008
vor 8 Jahren

Hallo mapi,

und sollte wohl kaum für jeden Termin eine neue Spalte hinzufügen oder? nein so nicht!

In einer relationalen Datenbank wie MySql speichert mein dies in mind 2 verschiedenen Tabellen

Tabelle 1: Patienten Infomation*ID (PrimaryKey) *Nachname *Vorname *Geburtsdatum *Anschrift *Therapeut *Krankenkasse *Schulart

Tabelle 2: SitzungsInformation*ID (PrimaryKey) *FK_Patentieninfo *Datum *Tätigkeiten während der Sitzung *...

Tabelle 3: Diagnose*ID (PrimaryKey) *FK_Patentieninfo *Diagnose *Informationen zur Diagnose *...

Die Tabellen stehen dann in einer 1:n Beziehung und Du kannst zu einem Patienten n-Sitzungen und m-Diagnosen speichern
siehe auch Normalisierung einer Datenbank

Gruß Gerhard

F
10.010 Beiträge seit 2004
vor 8 Jahren

Und warum MySql?
MySql ist im Professionellen Umfeld zu teuer ( Ja es kostet Geld ) und bietet zu wenig dafür.

Ansonsten sind das absolute DB Grundlagen, die solltest Du dir vorher wirklich aneignen.

16.835 Beiträge seit 2008
vor 8 Jahren

MySql ist im Professionellen Umfeld zu teuer ( Ja es kostet Geld ) und bietet zu wenig dafür.

Das stimmt so pauschal nicht.
Auch im kommerziellen Einsatz darfst Du die kostenfreie GPL-Lizez-Variante verwenden.
Es gibt aber Szenarien, wie das Einbetten von MySQL, bei denen die kommerzielle Lizenz nötig ist.
Setzt Du aber nur MySQL als Betrieb voraus und entscheidest Dich nur für das Verbinden zu einer MySQL Instanz, ist i.d.R. keine kommerzielle Lizenz pflicht.

Trotzdem steh ich Dir bei, dass mySQL nicht gerade die beste Wahl im professionellen Umfeld ist.

H
523 Beiträge seit 2008
vor 8 Jahren

Wenn MySQL nicht eingebettet wird und man den MySQL-Connector nicht verwendet, darf man MySQL zusammen mit der eigenen kommerziellen Software kostenlos einsetzen (sprich die Community Edition).

Ganz wichtig ist, dass man den MySQL-Connector von Oracle nicht zum Aufbauen der Datenbankverbindung verwendet (auch nicht mit der DbProviderFactory). Für den MySQL-Connector gibt es alternativen von Drittherstellern, die sogar kostengünstig sind.

Diese Infos habe ich im letzten Jahr vom Oracle-Support erhalten. Ich brauchte diese für ein Projekt bei dem der Kunde auf MySQL bestand.

M
mapi Themenstarter:in
10 Beiträge seit 2016
vor 8 Jahren

Hallo liebe Community,
ich arbeite noch immer an dem Projekt und hätte noch eine Frage:

Ich habe jetzt jeder Sitzung eine AktSitzungs_Nr als Eigenschaft gegeben, damit ich jede Sitzung PRO Patient identifizieren kann.
Patient A:
Sitzung 1: AktSitzungs_Nr 1
Sitzung 2: AktSitzungs_Nr 2
Sitzung 3: AktSitzungs_Nr 3
Sitzung x: AktSitzungs_Nr x

Patient B:
Sitzung 1: AktSitzungs_Nr 1
Sitzung 2: AktSitzungs_Nr 2
Sitzung 3:AktSitzungs_Nr 3
Sitzung x: AktSitzungs_Nr x

Nun gestaltet sich das ganze so dass die Sitzungen, je nachdem welche AktSitzungsNr sie haben, unterschiedlich ablaufen. Also die ersten 10 Sitzungen haben immer den gleichen Ablauf, dann die nächsten 10 haben wieder den gleichen Ablauf: etwa so:

Sitzung 1-10 Ablauf:

  • Sehtest
  • Hörtest

Sitzung 10-20 Ablauf:

  • Gleichgewichtest
  • Test von Farbsehen

Sitzung 20-30 Ablauf

  • Test XY
  • Test YX

Sitzung 30-40 Ablauf

  • Test XY
  • Test YX
    .....

das ganze geht dann immer so in 10er Schritten voran, bis SitzungsNr 150.
Ich möchte dass wenn man auf die jeweilige Sitzung klickt der Ablauf angezeigt wird, damit man sehen kann, was in der heutigen Sitzung abläuft.

Dadruch dass ich das ganze ja als sitzung.AktSitzungs_Nr gespeichert habe, habe ich ja direkt die Zahl zur Verfügung.
Also:

    If AktSitzungs_Nr &lt; 10 Then  
        MessageBox(&quot;Ablauf: Test 1, Test 2...&quot;)  
    ElseIf AktSitzungs_Nr &lt; 20 Then  
        MessageBox(&quot;Ablauf: Test 3, Test 4...&quot;)  
        Else If ....  
    End If

Mein Problem ist nun, dass das mehr als 15 verschiedene Abläufe mit jeweils ca. 8 verschiedenen Stichpunkten sind, und ich wollte fragen wie man diese am besten speichert. Jeden Ablauf in einem String und diesen dann einfach anzeigen? Oder sollte man das ganze irgendwie in eine .txt-Datei auslagern und dann anzeigen?

PS:
Achja, sorry ich programmiere in VB.NET, hoffe das ist nicht zu schlimm in einem CSharp Forum 😉

DANKE für die Hilfe 👍 👍 😁

5.299 Beiträge seit 2008
vor 8 Jahren

Du kannst mal mein Tutorial zum Thema Datenmodell studieren, und auch die beiden darauf aufbauenden Artikel:
http://www.codeproject.com/Articles/1030969/Relational-Datamodel
Ich denke, die Erklärungen sind einfacher als wie üblicherweise Daten-Normalisierung erläutert wird.

Teilweise scheint mir schon richtig umgesetzt, nur deine Benamung würde ich empfehlen, zu vereinfachen und zu vereinheitlichen.
Auch sonst sind im Tut allerlei Punkte benannt, auf die man achten sollte.

Insbesondere empfehle ich, die Datenbank erstmal wegzulassen, und nur mit einem Dataset zu arbeiten (reicht locker für ca. 20000 Test-Datensätze)

Ganz wird man dir hier die Datenmodellierung nicht abnehmen können.
Im weiteren kann man zu deinem Datenmodell nur vernünftig was sagen, wenn mans auch sieht.
Also ich würd vorschlagen, du postest Screenshot vom DatasetDesigner.

Alternativ kannst du auch stark reduzierte Formulierungen verwenden, um dein Modell zu beschreiben - sowas:
Relationen
Patient -> Sitzung
SitzungTyp -> Sitzung

und einem Datenbänker ist klar: hier liegt eine m:n - Relation vor.
Aber eiglich erst auffm Dataset-Screenshot sieht man dann, ob du das auch richtig umsetzst.

Wie gesagt, ich empfehle dir mein Tut, sowohl zum Verständnis der Zusammenhänge als auch um die notwendigen Fachbegriffe zu klären.

Die Logik mit dass alle 10 Sitzungen ein anderer SitzungsTyp dran ist - sowas ist im Datenmodell nicht abzubilden, dafür musste bisserl Business-Logik bringen.
Das mit AktSitzungNummer ist noch machbar im Datenmodell, aber etwas exotisch - da hätte man nämlich eine wechselseitige Relation:
Patient -> Sitzung
Sitzung -> Patient
Wobei die zweite Relation weniger strikt beschränkt sein muss.
Denn während es keine Sitzung ohne Patient geben kann, kann es durchaus einen Patienten ohne Sitzung geben.
(Zumindest im Programm tritt das für mikrosekunden auf, denn man kann Datensätze nur einen nach dem anderen adden.)

Der frühe Apfel fängt den Wurm.