Ist mein Datenmodell/ Datenbank-Entwurf so richtig?

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von cmdrcook.

    Ist mein Datenmodell/ Datenbank-Entwurf so richtig?

    Hallo, liebe Forum-Mitglieder,

    ich bin ein Anfänger in Sachen Datenbanken und VB.Net-Programmierung, mit Erfahrung in VBA-Excel.

    Ich möchte aus meinem selbst entwickelten VBA-Prototyp einer Anwendung für Profi-Köche (Zutaten und Rezepte verwalten, Speisepläne und Produktionspläne erstellen, Allergene und Zusatzstoffe deklarieren, Warenbedarf automatisch bei Lieferanten bestellen) eine Desktop-Anwendung machen und weiter entwickeln (kompilierte .exe).

    Dafür fehlt mir leider jede Menge Rüstzeug und ich hoffe auf Hilfe aus dem Forum.

    Ich werde hier nach und nach konkrete Problemstellungen aus meinem Projekt, zusammen mit meinem Lösungsansatz posten, in der Hoffnung, dass jemand drauf schaut und mir sagt, ob es so richtig und gut ist oder wie es besser geht.

    Anfangen möchte ich mit der Einheiten-Verwaltung.

    Alle in Rezepten verwendete Lebensmittel (ich nenne sie "Rohstoffe"), haben Einheiten: Stück, Liter, Kilogramm usw.

    Diese Einheiten sollen vom Programm vorgegeben werden, der Datenbestand und die Daten selbst sollen aber vom Benutzer erweiterbar und editierbar sein.

    Die Einheiten sollen in einer einfachen Baumstruktur mit je einem Ordner pro Einheitengruppe, ohne weitere Untergruppen, dargestellt werden.

    Dafür habe ich zwei Tabellen: tblEinheitGruppen und tblEinheiten.

    tblEinheitGruppen: ID, EinheitGruppe_Name, EinheitGruppe_Beschreibung

    tblEinheiten: Einheit_ID, Einheit_Gruppe, Einheit_Name, Einheit_Abkürzung, Einheit_Grundmenge, Einheit_Aktiv, Einheit_Ursprung, zugeordneteSystemEinheit_ID

    Beim Anlegen der Datenbank in Access geht es schon los mit meinen Fragen: welche Beziehungen muss ich wie setzen? Welcher Verknüpfungstyp? Mir referentieller Integrität oder ohne und warum?

    Im Anhang findet Ihr die Beispiel-Datenbank, und meine Excel-Anwendung (nur den Teil mit der Einheiten-Verwaltung).

    Die xlsm-Datei enthält Makros und musste vor dem Hochladen gezipt werden. Nach dem Entpacken und Öffnen der Datei müsst Ihr die aktiven Inhalte (Makros) aktivieren. Es wird eine neue Registerkarte (im Ribbon ganz rechts als Letztes: Registerkarte "ProdPlan") erzeugt, dort wiederum ganz links oben auf die Schaltfläche "Einheiten" klicken.

    Ich bin für jeden Tipp und jede Hilfe dankbar :)

    Viele Grüße, Dirk.
    Dateien
    Das ist ein sehr grosses Projekt für einen Programmier-Einsteiger.
    Und lösen kannste das nur, indem du programmieren lernst.
    Und Programmieren lernen tuste am besten von Anfang an. Also Was sind Datentypen, wie funktioniert VisualStudio, verschiedenste Schlüsselworte, wie lerne ich, vb.Net-Methoden zu benutzen, und vb6-Methoden nicht zu benutzen, Objektorientierung pipapo.

    All das: Datenverarbeitungs-Vorraussetzungen

    Das einzige, was du erstmal nicht brauchst, ist eine Datenbank - aber das ist in den weiter-verlinkungen des gegebenen Links auch begründet - ich mags nicht wiederholen.

    Hatte deine Initiative im Dingens-Bereich kein Erfolg, wo du einen Anleiter suchtetest? Das scheint mir nämlich eine gute Idee.

    Dein Datenmodell diskutiert man am besten anhand von hier eingestellten Screenshots des DatasetDesigners

    (Den Dataset-Designer wirste auch kennenlernen, wennde dem Link folgst)
    Visual Studio bedienen hat mal nichts mit Programmieren lernen zu tun.

    Rein Datenbank verstehen, erstellen, abfragen, es gibt sogar reine Datenbankprogrammierer.

    In dem Falle könntest du dann erst mal dein Excel als Frontend nehmen.

    Und dann das Entity Framework mit Database First. Da kann man dann als Programmierer Objektorientiert Arbeiten

    Mit einem Multiuse System bindest du dir mit dem Dataset einen Klotz ans Bein. Da ein vernünftiges Datensatz sperren hin zu bekommen....
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Hallo cmdrcook

    Deine Datenbank habe ich mir einmal angeschaut und verstehe dein Problem direkt. Du hast die Tabellen tblEinheitGruppen und tblEinheiten erzeugt. Wieso schreibst du tbl vor die Tabellen? Jede Tabelle sollte so heißen wie du es meinst. Ich nehme sogar noch kürzere Namen in dem ich alle Vokale aus dem Namen kille. Also aus Einheiten wird Enhtn und aus EinheitGruppen wird EnhtGrppn. Weil das kann man trotzdem lesen. Besser noch wäre es, wenn du die Tabellen in Englisch schreibst, dann ist das nochmal einfacher.

    Dein 2. Problem ist, dass du nicht verstehst, wie ein relationales Datenbankmodell aufgebaut wird. Das sieht man daran, dass du zwar 2 mal eine Spalte ID vergeben hast, mit korrekten Primärschlüssel. Aber sonst scheint das nur ins Blaue geschossen zu sein. Du verwendest in jeder Spalte auch noch den Tabellennamen. Macht einfach keinen Sinn, da die Spalte meistens über Tabellenname.Spaltenname angesprochen wird.

    Um das einmal abzuschließen. Die Tabellen sollten heißen wie sie heißen, ist aber Geschmackssache. Alles was keine Tabelle mehr ist, sollte dann eine Abkürzung haben. Also V_Name für Views etc. Nehme die Tabellennamen aus den Spalten heraus.

    Du hast also Einheiten und EinheitGruppen. Beides hat eine ID und du möchtest für eine Einheit eine Gruppe festlegen. Dann musst du die Spalte Einheit_Gruppen in Einheiten löschen (Umbenennen) und durch EinheitGruppenID ersetzen. Der Name ergibt sich aus TabellenNameSpaltenName der Ursprungstabelle. Dann ziehst du die ID der EinheitGruppe auf die Spalte EinheitGruppenID. Die referentielle Integrität ist wichtig. Damit verhinderst du das jemand eine Gruppe aus EinheitGruppen löscht und dann in Einheiten kein gültiger Verweis mehr vorhanden ist. Wenn also jemand die ID = 1 in EinheitGruppen löscht und noch Werte in Einheiten vorhanden sind, wo in der Spalte EinheitGruppenID noch der Wert = 1 steht. Dann wird die Datenbank einen Fehler auslösen und ein Löschen der EinheitGruppe ist nicht möglich.

    Die Werte Aktualisierungweitergabe und Löschweitergabe solltest du nicht aktivieren. Denn das bewirkt genau das. Die Aktualisierungsweitergabe ändert jede Eintrag in der Spalte EinheitGruppenID in Einheiten, wenn du die ID in der Tabelle EinheitGruppen veränderst. Das kann hilfreich sein, aber mir ist kein Fall bekannt, indem dies jemals notwendig war. Die Löschweitergabe löscht z.B. jeden Eintrag in Einheiten, wenn du eine EinheitGruppe löschst. Und das ist ein Supergau. Ich würde das Löschen eines Eintrags in EinheitGruppe nur zulassen, wenn auch alle Einträge in Einheiten nicht mehr auf diese Gruppe verweisen.

    soweit. Das Thema relationale Datenbanken ist wirklich komplex. Ich empfehle dir einen Kurs zu machen, wenn du wirklich Interesse hast. Denn auch eine Access-Datenbank ist keine Datenbank. Das ist nur ein Spielzeug für EinzelAnwender. Ab ca. 10 Benutzer bricht die Performance der Datenbank komplett ein und es macht keinen Spass mehr damit zu arbeiten. Selbst habe ich Access nur zum Designen am Rechner verwendet, bin aber schnell auf Oracle oder SQLServer umgestiegen. Weil das muss man sich ehrlich gesagt nicht antun.

    Und deine Idee ist gut, aber die Umsetzung wird richtig komplex. Und du wirst dabei sehr viele Fehler machen. Ansich auch ok. Aber nicht dann, wenn das auch produktiv eingesetzt werden soll. Ansonst kann ich dir die Hilfe von MS empfehlen. Nicht einfach durchscrollen, sondern lesen und verstehen.

    support.office.com/de-de/artic…be-457b-b992-2f6fb812b58f

    soweit...
    @Sio_x

    Grundsätzlich sollte kein Prefix vor die Tabelle und der Tabellenname nicht als Prefix vor eine Spalte, aber das ist nun mal die gängige Notation in Access Tutorials. Also Augen auf beim mosern.
    Aber die Tabellennamen noch zu verunstaltet ist echt nicht OK

    Ich bin selbst kein großer Access Fan, aber diese Überheblichkeit muss nicht sein. Accessnals Backend mit einer guten Server Software davor geht viel.
    MS SQL Express geht natürlich viel mehr
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Ja, deinen Einwand kann ich verstehen und wie du mich als abgehoben bezeichnest, ebenfalls. Aber ich sehe immer daran, dass die Leute aus der Access-Welt kommen. Und dann sehe ich auch die undurchdachten Konstrukte. Leider sind meistens die Umsetzungen einfach ...

    Entschuldigung, jeder fängt klein an. Aber bei einem solchen Projekt muss der Entwickler auch eine gute Lernkurve vorweisen. Ansonst scheitert dies auf ganzer Linie.
    Hallo Sio_x,

    ich habe nun also die Felder umbenannt und eine Beziehung gesetzt, siehe Bild.



    Würde das dann so ausreichen, um mein VBA-Beispiel aus der Excel-Mappe in ein Visual-Studio-Projekt zu übertragen?

    Ich stelle mit das ungefähr so vor:
    • Die Datenbank-Datei an zentraler Stelle ablegen
    • Ein UserForm erstellen, so wie ich es in VBA Excel schon habe
    • Code schreiben, welcher eine Verbindung zu der Datenbank herstellt
    • Code schreiben, welcher die Daten aus der Datenbank holt und in der gewünschten Baumstruktur darstellt, mich in den Datensätzen navigieren lässt, die Inhalte einzelner Datenfelder eines ausgewählten Datensatzes in Textfelder und ComboBoxen schreibt etc.
    • Code schreiben, welcher geänderte oder neue Daten aus der UserForm in die Datenbank zurück transportiert und dort speichert.

    Auch wenn Ihr Profis wohl alle mit den Augen rollen werdet: ganz bei Null anfangen kann und will ich nicht. Ich brauche ein funktionierendes Beispiel, anhand dessen ich mir die Grundlagen aneignen kann. Es tut mir leid, aber so bin ich nun mal gestrickt. Wenn ich sehe, dass was funktioniert, dann kann ich auch herausfinden, wie und warum es funktioniert.
    Bilder
    • EinheitVerwaltung Datenmodell.PNG

      9,68 kB, 775×396, 99 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cmdrcook“ ()

    Es gibt mehrere Wege. Für die Programmierung:
    1. Du versuchst deinen VBA Code in Visual Basic Code umzuschreiben. Da wirst du schon einen steinigen Weg haben. Das meine ich nicht negativ, sondern du musst umdenken. VBA und Visual Basic unterscheiden sich. Aus Gründen der Kompatibilität schleppt auch Visual Basic noch einige VBA Komponenten mit sich herum. Wie MsgBox, statt MessageBox. Dabei solltest du aber evtl. auf diese alten Sachen verzichten.
    2. Du verwirfst den gesamten VBA Code und machst es diesmal von vorn.
    Für die Datenbank:
    1. Du schreibst selbst deine Klassen zur Datenbank-Verbindung. Was aber als Anfänger nicht umbedingt zu empfehlen ist.
    2. Du überlässt Visual Studio die Datenbankverbindung. Du kannst darin auch die Datenbank bearbeiten, Abfragen erstellen etc. Für einen Anfänger wohl die beste Lösung.
    3. Du verwendest das Entity-Framework für die Datenbank. Dabei wird deine Datenbank objektorientiert abgebildet. Das Abfragen der Daten kann aber einen Anfänger leicht überfordern. Wobei das Anlegen der Daten, dabei relativ einfach scheint.
    Du wirst dich mit Klassen, Variablen, Datentypen, Sichtbarkeiten (also wie verdeckt sollten Variablen sein), Zugriffsmodifizierer etc. beschäftigen müssen. Das hat allein bei meiner Ausbildung 6 Monate Zeit in Anspruch genommen. Und du solltest das nicht unterschätzen. Vor allem, da du ja wahrscheinlich eh versuchen wirst den prozeduralen Ansatz aus VBA (Excel) in die Objektorientiere Umgebung (VS2017, VB oder C#) zu transferieren.

    Das wird viel Arbeit. Und wenn du nicht in falsche Denkmuster verfallen möchstest, dann empfehle ich dir echt Hilfe dazu zu holen. Und zwar im ersten Step durch Bücher wie: Einstieg in Visual Basic 2017 oder Einstieg in C# in Visual Studio 2017. Oder aber ähnliche Literatur. Das hat nämlich den Vorteil, dass du es richtig lernst. Den Code, den du für Probleme, gerade in Richtung Visual Basic per Google findest, ist entweder schon älter und nicht mehr state of the art (z.B. inkludieren der Windows-Api für simple Dinge als unmanaged Code oder viel VB6), oder er ist bei den Datentypen, Sichtbarkeiten (also wie verdeckt sollten Variablen sein), Zugriffsmodifizierer etc. noch recht ausbaufähig.

    Genauso solltest du dir Gedanken machen: Muss es unbedingt Visual Basic sein, vielleicht ist C# eine bessere Alternative? Gerade weil du in C# alte Denkmuster aus der VBA Zeit ablegen musst. Beide Sprachen habe ihre Vorteile, beide haben ihre Nachteile, am Ende münden beide in .Net Code.

    Wie auch immer du dich entscheidest, es wird deine nächsten Schritte enorm beeinflussen. Wähle daher sorgfältig.

    cmdrcook schrieb:

    Auch wenn Ihr Profis wohl alle mit den Augen rollen werdet: ganz bei Null anfangen kann und will ich nicht. Ich brauche ein funktionierendes Beispiel, anhand dessen ich mir die Grundlagen aneignen kann.
    Ich empfehle dir sehr dringend, doch mal in den von mir gegebenen Link reinzuschauen.
    Andere mögen ja mit Fleiss jeden meiner Punkte demontieren, und dann selbst nichts konkretes anbieten.
    Aber wenn du was konkretes möchtest, und sinnvoll aufgebaute Anleitung, und einen Weg von Null bis fertig, und lauffähige Codebeispiele - wie gesagt: Lass dich mir nicht vermiesen und vernebeln.

    Übrigens ist "bei Null anfangen" zweideutig. Wenn du damit meinst, du musst alles ohne jede Vorlage aufbauen, dann hast du recht - solch wäre ineffizient und ist nicht nötig. Und ich habe dir jetzt 2 mal gesagt, wo du Vorlagen findest.
    Wenn du mit "nicht ganz bei Null anfangen" allerdings meinst, du wüsstest schon ein bischen über Programmierung bescheid, dann irrst du dich (und wirst dich noch sehr wundern). Die VBA-Programmiersprachen sind von .Net unterschiedlicher als man es sich überhaupt vorstellen kann.
    Leider funktionieren viele veraltete Vorgehensweisen nachwievor, ein Stück weit - quasi parallel zum "wirklichen" .Net. Und das ist das verheerende, weil wenn du die olle Grütze reproduzierst, kommt da nichts als Grütze bei raus. Da es aber kompiliert, und bischen geht, wurstelt man immer weiter in die falsche Richtung, und lernt nie - wie es richtig geht, und wie einfach das ist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Puuhh ... ich hatte sowas befürchtet. Ich habe mich an eine große Nummer ran gewagt. Ich komme zwar voran und erhalte funktionierende Ergebnisse. Da ich aber so ein CopyPaste–Hobbyprogrammierer bin, habe ich mir viel Halbwissen zusammengestoppelt und verstehe nicht alles, was ich da so code. Könnte mir auch egal sein, funktioniert ja alles irgendwie. Aber ich sehe trotzdem, dass ich irgendwann an einen Punkt kommen werde, wo es nicht mehr weiter geht und mein Projekt im Sande verlaufen könnte...

    Ob ich will oder nicht, ich muss das Ganze auf bessere Füße stellen. Mein Problem dabei: die Zeit. Wenn ich alles das richtig lernen will, brauche ich fünf Jahre oder so. Bis dahin gilt der heutige Stand der Technik wieder als veraltet ... und ihr lächelt wieder über den Verrückten, der ohne Ahnung was richtiges programmieren will.

    Ich stecke viel Freizeit in die Sache, weil ich sie für die Arbeit tatsächlich brauche. Leider stoße ich mit meinen Rufen nach einer gescheiten Branchensoftware, die es schon lange gibt, auf extrem taube Ohren. Also baue ich mir eben selber was.

    Ich muss jetzt erst mal nachdenken ... wahrscheinlich stoppele ich in VBA weiter, bis das ganze für meinen Betrieb steht und funzt. Das bringt mir einen riesigen Produktivitätsschub, weil ich mit dem Programm mehrere Prozesse, die wir zurzeit parallel und mehrfach ausführen müssen, zusammenfasse und automatisiere.

    Und dann habe ich jede Menge Zeit zum lernen

    Auf jeden Fall vielen Dank für Eure Tipps, denen ich dann wohl nachgehen werde.

    Gruß, Dirk

    Von meinem iPad gesendet