Aufbau Typisiertes DataSet / DataTable / Beziehungen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Aufbau Typisiertes DataSet / DataTable / Beziehungen

    Moin moin

    Ich möchte weiter in das Thema "Aufbau Typisiertes DataSet / DataTable / Beziehungen" einsteigen und plane ein weiteres kleines Tool für mein Opa.
    Aufgabe ist die Erfassung von bestimmten Werten rund um seine Gesundheit, welche dann in einer XML-Datei gespeichert werden sollen.

    Dazu habe ich nun ein DataSet und einige DataTables erstellt und "versucht" die richtigen "Beziehungen" zu erstellen.

    Nun meine ersten Fragen:
    1.) Bin ich hier auf dem "richtigen Weg"?
    2.) Geht das funktional in einer XML-Datei?

    *Topic verschoben*
    Bilder
    • bzAufgabe2.jpg

      276,12 kB, 1.000×538, 350 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo,

    Amelie schrieb:

    1.) Bin ich hier auf dem "richtigen Weg"?

    Nein. Die Felder IDMedi, IDVital und IDBlutzucker haben in der Person-Tabelle nichts zu suchen. Wenn brauchst du in den anderen Tabellen das Feld PersonId. Ich würde außrdem alles auf englisch benennen. Umlaute in Tabellen-/Feldnamen können zum Problem werden.

    Amelie schrieb:

    2.) Geht das funktional in einer XML-Datei?

    Was meinst du mit "funktional"? Die Daten können sicherlich in einer XML-Datei gespeichert werden. Ich halte aber eine XML-Datei als "Speicher" nicht sonderlich sinnvoll. Zur Übung wirds reichen.
    Ich würde alle Messwerte, so wie sie anfallen mit Timestamp und Typ in eine Tabelle speichern (s. Anhang).

    Und alle Aktionen (Medikation, Essen, Sport...) in eine andere, ebenfalls mit Timestamp und Typ.

    Bei der Auswertung kannst du dann selektieren, was notwendig ist.

    Bedenke, dass nicht unbedingt alle Messungen zeitgleich und vollständig erfolgen.
    Bilde mit deinem Datenmodell die Wirklichkeit ab und versuche nicht, die Wirklichkeit in dein Datenmodell zu pressen.
    Bilder
    • Bild_2023-06-30_132150689.png

      6,5 kB, 349×205, 468 mal angesehen
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod
    ​Bedenke, dass nicht unbedingt alle Messungen zeitgleich und vollständig erfolgen.

    Ja das habe ich bedacht. Muss mal darüber nachdenken, wie ich das dann nach deinem Schema umbaue und dann später verwenden kann.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Gewicht und BMI sollten auch separiert werden. Sind ja nicht konstant.
    Was hat es bei Glucose mit morgens, mittags, abends und BZ-Wert-1, BZ-Wert-2, BZ-Wert-3 auf sich? Dind morgens, mittags, abends Zeitangaben oder Blutzuckermesswerte?
    Cholesterin wird mit CH geschrieben.
    Welche Bedeutung hat Datum in der Medicine-Tabelle? Wann er angefangen hat, ein Präparat in einer bestimmten Dosis einzunehmen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Zum Beispiel ist Cholesterin und Blutzucker beides ein Messwert, stehen aber in verschiedenen Tabellen.
    Du brauchst nicht eine Tabelle "Blutzucker", sondern eine Tabelle "Messwert". Unterscheiden kannst du mit einer Typ Spalte, hierfür brauchst du dann eine Messwerttyp Tabelle, erst in dieser würden dann die Typbezeichnungen "Blutzucker" und Cholesterin" auftauchen.

    Das Gewicht ist ja auch ein Messwert, das könnte genauso da rein wie später noch beliebige andere. Man könnte dort auch unterscheiden ob der Messwert ein "Nacht"Blutzuckerwert ist oder ein "Tag"Blutzuckerwert, wenn das denn sinnvoll ist, andererseits könnte man sagen, dass sich das aus dem Zeitstempel ergeben muss. Aber vielleicht gibt es ja auch Nachtblutzuckerwerte die am Tag gemessen werden; ich bin kein Arzt^^

    Mit DataSet.WriteXml haut der alles was du bastelst in eine Xml, also solange du es in ein DataSet kriegst, kriegst du es auch als Xml.
    Gerade von Zeitstempeltabellen bin ich allerdings gewohnt, dass diese immens groß werden und dementsprechend besser in einer DB stehen. Aber man kann alte Daten ja auch rausschmeißen, ich glaub der Blutzucker von vor 3 Monaten hat nicht viel Relevanz.

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @VaporiZed

    In der Tabelle Glucose: Da muss er min 3Mal Täglich messen, der 4 Messwert ist nicht immer nötig.
    Ich häng mal ein Bild an wie er das macht.
    Bzgl. der Tabelle Medicin: Genau, wann er mit welchem angefangen hat und wann er wieviel davon einnimmt.

    @Haudruferzappeltnoch
    Die Trennung der Messwerte deswegen, weil er den "BZ" eigentlich immer messen muss, den Rest eigentlich bei bedarf. Deswegen wollte ich auch dafür das spätere DGV oder die DGV's entsprechend machen. ggf sogar in seperaten Forms. Das weiß ich noch nicht genau. ;)
    Bilder
    • bzAufgabe.jpg

      63,54 kB, 800×126, 316 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Der Messwerttabelle ist egal wann welcher Messwert gemacht wird. Die nimmt alles auf.

    In dem Sinne wo wäre das Problem so:
    Von da aus ists nur noch ein kleiner Schritt zu einen allgemeinen Tabelle.


    Separieren kannst du da trotzdem, wie gesagt in dem du die Typen spezifizierst

    SQL-Abfrage

    1. Select M.Zeitpunkt, M.Wert from Messwerte M
    2. Inner Join Messwerttypen T On M.Typ = T.ID
    3. Where T.Bezeichnung = "Nachtblutzucker"

    liefert dann 01.01.2000 00:00:00; 142

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Dann wiederhol ich den Kommentar von Haudruferzappeltnoch: Mach eine Messwert-Tabelle. Was dann gemessen wird, kannst Du in einer Int32-Spalte (also eine Art Feldindex) angeben. 0 = Blutzucker, 1 = Cholesterin, 2 = Gewicht, …
    Vor allem das mit der optionalen 4. Messung spricht dafür. Und ich hoffe, dass er sowas wie ein Freestyle Libre hat und sich nicht jeden Tag 3-4x die Finger (zer)stechen muss.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Man könnte auch einfach über einen Bindingsourcefilter und einen Enum sich die Messwerttyp-Hilfstabelle sparen; auch die DataSource festlegen ist dann deutlich einfacher.
    (Dann verliert man aber die Info über die physikalische Einheit)

    In Datenbanken sind solche Hilfstabellen ganz oft zu finden, denn damit spart man vor allem Speicherverbrauch.
    Moin moin

    Habe wieder ein bissel gelernt und hoffentlich richtig verstanden, deshalb nun meine Frage:

    Ist das so mit den Beziehungen meiner Tabellen in der Datenbank richtig? :?:

    Was bedeutet "Akzeptans Ablehnungsregel" :?:
    Bilder
    • dbBeziehungen.jpg

      161,36 kB, 1.110×569, 317 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    AFAICS (= soweit ich sehen kann): ja, passt
    AkzeptanzAablehnungsregel: Da bist Du wohl hier gelandet: AcceptRejectRule

    Du tust Dir mit der Spaltenbenennung keinen Gefallen:
    • IDUser und ähnliche: ok, ist Geschmacksfrage. Ich hänge ID immer hinten an (also UserID), so kenne ich es meistens, aber ist Dein Ding.
    • TransDate, VatRate, TransType: durch Namenskürzungen wird das Gehirn beim Lesen jedes Mal wieder verpflichtet, die »verwendete Wortverschlüsselung« wieder zu »entschlüsseln«. Du musst also jedes Mal wieder überlegen: ›Wofür stand gleich Trans? Und Vat war gleich …? Und war CatName jetzt die Kategorie oder der Name meiner Katze?‹ Schreib die Spaltennamen aus: TransactionDate. Bei VatRate weiß ich z.B. nicht, was Du meinst. Verwende Abkürzungen nur, wenn sie im allgemeinen oder in Deinem Umfeld bekannt und eindeutig sind. ID, Mwst (ist zwar deutsch, aber es geht um das allgemein-bekannt-Prinzip), ETA (estimated time of arrival, ist ggf. aber nicht jedem bekannt!)
    • Description, nicht Discription
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    OK hab die Spaltenbezeichnungen nochmal geändert.

    AkzeptanzAablehnungsregel Das kapiere ich auf der MS-Seite nicht.
    Kannst du mir das mal mit "einfachen Wörtern" und Beispiel erklären?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Mit »einfachen Wörtern« klappt es wohl nicht, aber vielleicht mit einfachen Worten. Da ich die Tabellen-Beziehungs-Einstellungen damals, als ich noch DataSets verwendet hatte, nicht relevant veränderte, kann ich mich mit meinen Spekulationen nur an stackoverflow orientieren: Datensätze werden nur dann in die ggf. angeschlossene DB übernommen, wenn AcceptChanges aufgerufen wird. Oder Änderungen werden verworfen, wenn RejectChanges aufgerufen wird. Wenn Du nun CatName (Teil der Category-Tabelle) und TransDate (Transaction-Tabelle) änderst, würde bei der normalen/default Einstellung der Tabellenverknüpfung AkzeptanzAablehnungsregel = none beim Aufruf von AcceptChanges auf die Category-Tabelle nur die Category-Tabelle aktualisiert werden, nicht aber die Transaction-Tabelle. Bei Cascade würde auf die untergeordnete Transaction-Tabelle aber automatisch AcceptChanges angewendet werden, die Daten würden also dort automatisch akzeptiert werden und in die DB geschrieben werden.
    Aber: Inwieweit dank des tDS-Codes während der Programmausführung und evtl. dank DataBinding AcceptChanges automatisch ausgeführt wird, weiß ich nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich bastel Adapter immer selbst, und gerade da kenne ich es anders.
    Adpt.Update übernimmt die Änderungen, die in der Tabelle vorliegen. Nach AcceptChanges liegen der Tabelle aber keine Änderungen mehr vor. Die Methoden AcceptChanges und RejectChanges haben bei mir dementsprechend nie Einfluss auf die angeschlossene Datenbank, sondern beeinflussen nur das DataSet.
    Jetzt weiß ich nicht, ob das daran liegt, das ich Fill und Update Methode selbst steuere.
    hmmm..

    Dann muss ich das in meinem Beispiel wohl auch auf "Cascade" setzen.

    @Haudruferzappeltnoch

    ​das ich Fill und Update Methode selbst steuere.

    wie kann ich das verstehen?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Dann muss ich das in meinem Beispiel wohl auch auf "Cascade" setzen.
    Nein, nicht zwangsläufig. Belass es erstmal bei der Standardeinstellung und probier gezielt aus, was gespeichert wird, wenn Du nur einen Eintrag in einer übergeordneten Tabelle (Category -> CatName) und in einer untergeordneten Tabelle (Transaction -> VatRat) änderst und sonst nix. Wenn nämlich beides automatisch gespeichert wird, sind zusätzliche Änderungen in den Tabellenbeziehungseinstellungen nicht nötig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.