DatenModellierung Problem (Veranstaltung eines Vereins)

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 139 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    DatenModellierung Problem (Veranstaltung eines Vereins)

    Hallo,
    ich bin gerade in der Planung eines Privaten Projektes. Es geht um gemeinnützige Vereine, die kleinere Veranstaltungen ausführen (Kleiderbasare, Spielzeugbasare usw.)
    Nun bin ich mir unsicher über das DatenModel.
    Erstmal zum Ablauf, wie ich mir so eine Veranstaltung vorstelle.
    Verein (Organizer) bekommt Zugangsdaten (OrganizerLogIn). Nach erfolgreichem einloggen kann der Organizer seine Daten vervollständigen.
    Dann kann der Organizer eine Veranstaltung erstellen und dafür einen Verantwortlichen (Responsible) eintragen. (Der Verantwortliche kann gleichzeitig auch Verkäufer sein)
    Zu der Veranstaltung werden dann Verkäufer (Seller) erstellt die wiederum Zugangsdaten bekommen (SellerLogIn) und nach Anmeldung können diese Artikel (Article) für sich erstellen.
    Die Anwendung ruft dann zur entsprechenden Veranstaltung die Verkäuferdaten ab und rechnet nach der Veranstaltung mit den Verkäufern ab (Umsatz -Provision).
    Die Artikel werden über ein Kassenprogramm abgerechnet. (muss ich noch ausarbeiten) beide Programme (Verwaltung und Kasse) greifen auf die gleiche DB zu. (so der Plan)
    So im Groben läuft es ab.
    Ich hab dies mal in einem UML zusammengeklöppelt:
    Falls man die Beziehungen nicht gut erkennt auf dem Bild:
    ModelBase ist eine Basisklasse
    LogIn, Organizer, BazaarEvent, Article und PersonBase erben von ModelBase
    Responsible und Seller erben von PersonBase.
    1:1 Beziehung zwischen LogIn (UserID) und Organizer (LogInID)
    1:1 Beziehung zwischen LogIn (UserID) und Seller (LogInID)
    1:n Beziehung zwischen Organizer (OrganizerID) Und BazaarEvent (OrganizerID)
    1:n Beziehung zwischen Responsible (ResponsibleID) und BazaarEvent(ResponsibleID)
    1:n Beziehung zwischen BazaarEvent (EventID) und Seller (BazaarEventID)
    1:n Beziehung zwischen Seller (SellerID) und Article (SellerID)

    Unsicher bin ich mir nun 1. beim Datenmodell, ob dies so sinnvoll ist und 2. bei der Gestaltung der Klassen, ob dort die Beziehungen richtig abgebildet sind.
    Vielleicht könnte jemand kurz drüber schauen und mir sagen ob ich auf dem richtigen Weg bin.

    Danke Euch
    P.S. die Klassen hänge ich als Projekt mit dran.
    Dateien
    • Bazaar00.zip

      (4,02 kB, 110 mal heruntergeladen, zuletzt: )
    "Hier könnte Ihre Werbung stehen..."
    mir fällt zunächst mal nichts auf den ersten Blick unpassendes auf. Umsetzen wirste das wohl mit EF und CodeFirst?
    Weil damit können die Entitäten sowohl relationale also auch Vererbungs-Beziehungen modellieren.
    Nur für die PKs hätte ich eine annere Namenskonvention, aber die kennste glaub schon.
    Ach so - jetzt wundert mich doch, dass einige Entitäten von ModelBase erben, annere nicht.
    Hallo

    Hab mir jetzt nur das Diagram angesehen.
    So wie ich das sehe erben alle von ModelBase bzw. von PersonBase wobei PersonBase wieder von ModelBase erbt.

    Aber.... In der Basisklasse hast du eine Eigenschaft ID. Warum dann in den Entitäten nochmals. z.b. in Seller die SellerID. Das ist doch über die Eigenschaft ID in der Basisklasse abgedeckt oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi Ihr beiden,

    Das Diagramm ist etwas falsch, da ich mit dem UML Programm noch nicht warm war. (nennt sich NClass)
    Das mit den zusätzlichen ID liegt daran, das ich nicht genau weis, ob in der Datenbank die ID, welche ja eine GUID ist, auch abgelegt werden kann. Welchen Datentyp gibt es bei MySQL dafür?
    Ich habe dennoch das UML noch einmal angepasst (jetzt auch mit den richtigen Assoziationen und Vererbungen).

    Von ModelBase erbt quasi alles, da PersonBase auch von ModelBase erbt. Responsible und Seller sind ja Personen, daher erben die beiden von PersonBase.
    Ich hab Privat nur einen MySQL Server zur Verfügung, der obendrein nicht extern erreichbar ist, daher weis ich nicht, ob das mit EF klappen würde.
    Ich muss aber eine DB im Internet verwenden, da das sonst von den Verkäufern nicht händel bar ist.
    Es gibt breits ein fertiges WinForms Programm, das ist allerdings auf eine einzelne Person zugeschnitten und verwendet ExcelTabellen als Vorlage für die Verkäufer und die Etiketten und als "Datenbank" ein TypDataSet.

    Im Grunde soll es etwa so nachher aussehen.
    Vorerst würde ich in der Datenbank den User anlegen und einem Organizer zuordnen.
    Der Organizer öffnet das Programm, logt sich ein und vervollständigt seine Daten (Organizer Klasse und Responsible Klasse).
    Dann erstellt er einen BazaarEvent (BazaarEvent Klasse) und erstellt dazu die Verkäufer, allerdings nur die Anzahl von Verkäufern (zum Beispiel 50)
    Die 50 Verkäufer werden in der Datenbank angelegt und zu jedem Verkäufer wird auch ein User angelegt.
    Der Verkäufer loggt sich dann auf einer Internetseite ein (Seller Klasse und User Klasse), vervollständigt seine Daten und erstellt seine Artikel.
    Dann kann er die Etiketten für die Artikel ausdrucken.
    Der Responsible öffnet das Programm und ruft die SellerArticle Daten ab und speichert sie lokal ab (XML).
    Von da ab, wird keine Internetverbindung mehr benötigt.
    Dann wird die Kasse erstellt (ist dann ein zusätzliches Programm was als Datengrundlage die XML bekommt, es können durchaus mehrere Kassen werden).
    Am Schluß werden dann die einzelnen XML von den Kassen wieder ins HauptProgramm eingelesen, ausgewertet und in die online Datenbank hoch geladen.
    Der Verkäufer kann sich wieder einloggen und seine UmsatzRechnung ausdrucken.

    So ist im Groben der Ablauf. Die Zwischenspeicherung lokal muss erfolgen, da viele Vereine in den Örtlichkeiten, wo der Basar stattfindet keine Internet Möglichkeit haben, und auch kein lokales Netz da ist, sodass man übers Netzwerk nur eine Datenbank nutzen könnte.
    Falls da jemand nen besseren Vorschlag hat, nur her damit :)
    Mit dem WinForms Programm klappt das schon ganz gut und damit wurden schon einige Basare abgehalten.
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Ich hab Privat nur einen MySQL Server zur Verfügung, der obendrein nicht extern erreichbar ist, daher weis ich nicht, ob das mit EF klappen würde.
    Ich muss aber eine DB im Internet verwenden, da das sonst von den Verkäufern nicht händel bar ist.

    Sehe ich zwei möglichkeiten. Die erste (und schönere) ist ein WebService drumrum zu erstellen. Das Webservice läuft am Server und kommuniziert mit der DB, läd, speichert usw. Hier wäre dann auch der großteil der Logik gleich ausgelagert. Die zweite wäre die DB einfach von außen erreichbar zu machen. Klappt mit EF super birgt aber mehr Risiko.

    Ich habe Momentan (oder besser ein Freund) ein Projekt am laufen wo ein ähnliches Problem/eine ähnliche Aufgabenstellung vorliegt. Da ist/war es so das es eine lokale DB geben musste welche verwendet wird wenn keine Verbindung zur Remote-DB besteht weil kein Internet oder so. Gleichzeitig könnten aber andere Personen in der RemoteDB was verändern, hinzufügen oder löschen. Wenn wieder eine Verbindung da ist müssen die DBs syncronisiert werden. Der Sync muss dann auch in beide Richtungen funktionieren. Ich habe das mit dem Microsoft Sync Framework gelöst was im übrigen super funktioniert.

    Aber ich denke fast, das wäre für dein Projekt wohl zu viel des guten. Fix ist, dein vorhaben muss gut durchdacht werden wenn du später keine Probleme bekommen willst.

    PS: Warum nutzt du nicht die Diagramtools von VS? VS kann dir automatisch anhand deiner Modelklassen das Diagram erstellen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    funktioniert der Webservice denn auf PHP Basis? weil der Server im Netz ist ja Linux und kein Windows.
    Zur Not müsste ich mir einen Server mieten...
    Das MS Diagramm Tool kenne ich. Da müsste ich allerdings erst die Klassen erstellen und dann das Diagramm.
    Ich verstehe es immer besser, wenn ich erst ne Zeichnung auf Papier mache, dann das UML und dann die Klassen erstelle.
    Ja, das Projekt kann wirklich ausarten.... :( ich hätte es persönlich auch so gelassen wie es war, allerdings hat meine Bekannt (für die ich das mal erstellt hatte) nun einige andere Vereine an Land gezogen, die gerne das Programm nutzen würden. Unter anderem Vereine die mehr als 500 Verkäufer haben, da wird das mit der ExcelVorlage schwierig, daher die Überlegungen es ins Internet zu verlagern.
    Da ich darin nicht er Erfahrenstze bin, werde ich oft hier nachfragen müssen.
    Viel Logik in den Webservice legen ist auch gut, da das Projekt später kommerziell genutzt werden soll, also die Vereine werden da einen Obolus zahlen müssen.
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    da das Projekt später kommerziell genutzt werden soll, also die Vereine werden da einen Obolus zahlen müssen.

    Dann würde ich da von meiner Seite auf jeden Fall auf Service(s) setzen. Gerade wenn etwas stark verteilt ist hast du den Vorteil das du änderungen an der Logik jederzeit vornehmen kannst solange diese im Service passiert.
    Ohne jetzt an alle 500 Verkäufer ein neues Release ausrollen zu müssen. WebService updaten und fertig. Auch die Website kommuniziert mit dem Webservice und du hast alles an Logik an einem Platz.

    Die App und die Website und evtl. ne Xamarin App stellen nur die Daten dar. Mit PHP kenne ich mich nicht aus, Asp.Net Rest API habe ich schon einiges gemacht. Ich würde sowas (500 Verkäufer) sowieso nicht mehr am eigenen Server laufen lassen. Wenn da was ist und das geht Offline ist es doof. Bei 1 und 1 gibts schon sooo günstig Webspace inkl. MySql und/oder MS Sql Datenbanken. 1 und 1 hat auch Windows Server im Angebot, habe selbst 2 dort.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    also die Verkäufer brauchen eigentlich kein neues Release, denn die Verkäufer sollen nur auf die Webseite zugreifen, dort Ihre Artikel einstellen und die Etiketten abrufen. Ein eigenes Programm bekommen die nicht, wäre auch nicht machbar, denn ich weis ja nicht, welche Systeme die alle haben. Ist ja jetzt mit Excel schon schwierig, weil viele garkein Excel haben.

    Im Grunde benutzt das Programm der Verantwortliche (Responsible) des Vereins/Veranstalters (Organizer).

    Mit eigenem Server meinte ich, den Server meines Webspace. Im Moment ist mein Webspace bei G-Factory gehostet.
    Dort kann ich mit MySql Datenbanken erstellen und auch darauf zugreifen (allerdings nicht von extern).
    Ich hab früher viel mit PHP gemacht, aber seit einigen Jahren garnichts mehr.
    Ich schaue mal, was bei G-Factory ein Windows Server kostet, ansonsten schaue ich mir mal 1+1 an (obwohl ich die nicht mag, kenne den Chef und den Mensch aus der Werbung auch).
    Hauptzentrale von denen ist bei mir um die Ecke...
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Wie gesagt, PHP weis ich nicht. Ist nicht meins. Wenn du von extern nicht an die DB kommst bleibt aber nichts anderes über als auf dem Server auf dem die DB liegt auch ein Service laufen zu haben welches die Daten manipuliert.
    Da kommste nicht drum rum. ;)
    Ausser mittels PHP gebe es einen einfachen Weg.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    MichaHo schrieb:

    Viel Logik in den Webservice legen ist auch gut
    Wir machen damit derzeit nicht so gute Erfahrungen.
    Dass man nachträglich Logik ändern kann halte ich für total überbewertet, weil man kann wirklich nur die Logik ändern - die Contracts sind in Stein gemeisselt.
    Und in unserer(!) Praxis kommts nie vor, dass nur Logik zu ändern ist, die dann quasi auf eine neue Art aber doch nur dasselbe Ergebnis erbringt.
    Sondern es kommen neue Anforderungen, das braucht neue/andere GUI, dann muss doch der Client neu geschrieben werden, und im Service die Contracts erweitern/ändern, und Logik im Client (ganz ohne kann der ja nicht) und Logik im Service, und womöglich noch feature-spezifische Logik inne DB.

    IMO sollte man mal Prinzipien ausarbeiten, wann Logik im Service anzusiedeln ist, und wann im Client.
    Etwa wenn ein Feature nur im Client besteht, dann soll es dort auch implementiert sein.
    Und hat auf einem Service - der womöglich noch von andersartigen Clients beansprucht wird - nichts verloren.
    (Ich meine mit "Client" eine Win-Desktop-Anwendung, bei Browser-Anwendungen mags anders sein)

    Also für uns wärs glaub viel besser, der Service würde einfach die Datenbank-Tabellen durchreichen, und sich dabei (sorgfältig!!) um Berechtigungen und Logging kümmern, sonst nichts.
    Und natürlich bestimmte Massen-Operationen auf der DB.

    Wenn dann neue Features kommen, bräuchten wir nicht zusätzlich zu den ohnehin unvermeidlichen Client-Änderungen auch noch neue Services schreiben, und neue StoredProcedures (davon gibts eh schon viel zu viele).

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

    Hi,
    ja, das klingt logisch. Wenn ich den Ablauf, den ich im Kopf habe, durchgehe, passiert im Internet eigentlich tatsächlich nur Datenbank relevantes. Eingabe von Artikeln, prüfen von LogIn Daten. Der ganze Rest passiert eigentlich im Client und meist offline.
    "Hier könnte Ihre Werbung stehen..."
    Hi,
    hab nun mal das Klassendiagramm in VS erstellt.
    Hab leider keine Möglichkeit gefunden (Bilnd?) wie ich nun die Assoziationen zwischen den einzelnen Klassen anzeigen kann, alsoID von Login (geerbt von ModelBase) zu LoginModelId in der Klasse Organizer.
    Hat da jemand nen Tip? Oder benötigt man dies nicht weil man es anhand der Member sieht?
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Kannst du mal bitte ein einfaches Projekt mit dem Klassen hochladen. Ich hätte da ein paar vorschlöge, denke aber das man das direkt in den Klassen besser machen kann.
    So habe ich auch selbst einen besseren überblick.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo

    Ne, es geht ja im Moment nur um das Model oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    JA, klar. Aber sehen wir uns mal das Model an und dann gehen wir wieder eines weiter.
    Problem ist eben - ändert sich später das Model weil man merkt das es einfach hinten und vorne nicht passt muss man immer die ViewModels auch ändern.

    Nicht bei kleinen änderungen, aber größere änderungen sind eben immer mit änderungen im ViewModel verbunden und das ist ja nicht notwendig ;)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    und das ist ja nicht notwendig


    What?
    Anbei das Model Projekt:Bazaar00.zip
    Hab da mal gerade noch eine Grundsätzliche Frage. Bisher hab ich es so, (ich glaub, die lehrst es auch so) das das INotifyPropertyChanged lediglich im ViewModel angewendet wird und die Models einfach nur die Properties haben.
    Im Netz gibt es viele Beispiele, die die Models schon mit PropertyChanged ausstatten und gleich auch mit DataErrorInfo.... was ist da nun korrekt?
    "Hier könnte Ihre Werbung stehen..."
    Guten Morgen

    MichaHo schrieb:

    What?

    Damit meinte ich das wenn das Model passt man nicht so viel/oft andere anpassungen während der Entwicklung machen muss.

    MichaHo schrieb:

    Hab da mal gerade noch eine Grundsätzliche Frage.

    Das ist richtig, das findet man oft und ist unter gewissen umständen bei sehr einfachen Projekten auch ein gangbarer Weg - verletzt aber das MVVM Pattern.
    Das Problem dabei ist folgendes. Arbeitest du mit Binding würdest du dann ja direkt auf das Model-Objekt binden. Gut, da es INotifyPropertyChanged implementiert bekommst du auch änderungen mit, aber sobald man das Model auch zum speichern hernimmt (Serialisierung, Entity Framework usw.) bekommt man schnell Probleme.
    Oft möchte man im View Daten anders eingeben/anzeigen wie diese im Model abgebiltet sind.

    Ein kleines Beispiel, oder zwei:
    Ich möchte ein Bild in der DB als ByteArray speichern. OK, also habe ich ein Property ImageData. Ups, wie zeige ich das im View nun an? Wie bekomme ich ein Bild nun vom View (OpenFileDialog) in dieses Array?
    Noch eines: UserLogin - Im Model habe ich eine Eigenschaft die angibt wann das Kennwort abläuft.(Datum) Im View möchte ich aber anzeigen wieviele Tage es noch dauert bis das Kennwort abläuft. (TimeSpan)

    Ich muss mich an diesen Stellen dann "verbiegen". Ich muss zusehen das ich diese zusätzlichen Eigenschaften vom Speichern ausschließe und benötige evtl. diverse Converter im View.
    Ein sehr gutes Beispiel sind dann eben auch Commands. Commands sind ja auch Properties, die muss ich alle ausschließen.

    Es stimmt, es ist weniger Arbeit, ich kann direkt auf die Model-Objekte binden und habe alle funktionalitäten drinnen.
    Man kommt aber schnell an einen Punkt wo das nicht mehr reicht - dann fängt man an für ein spezielles Model ein extra ViewModel zu erstellen weil man flexibler ist, dann noch ein weiteres. Und im nu kennt man sich nicht mehr aus für welche View man nun ein ViewModel hat und für welche man an ein Model bindet.

    Aber es ist eben Geschmacksache - bei einigen kleineren Anwendungen reicht dies sicher.

    Zum Thema IDataErrorInfo:
    Das halte ich für sinnvoller und habe ich auch oft im Model enthalten, allerdings nur wenn das Model-Objekt direkt gespeichert werden soll/muss. So ist eben sichergestellt das ein Model-Objekt immer "Valid" ist.
    Dies mache ich im Model immer mit DataAnnotation.
    Allerdings habe ich IDataErrorInfo immer im ViewModel auch enthalten und überprüfe immer dort sowohl das Model als auch das ViewModel.

    Ich hoffe das war verständlich, soll ich dir "meine" Validierungslogik mal in dein Model implementieren?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##