Zum Inhalt springen

Datenmodel für einen Kalender: Problem "Turnus"


Empfohlene Beiträge

Geschrieben

Hallo zusammen!

Ich modelliere einen Kalender, der es dem Benutzer u.a. ermöglichsen soll, wiederkehrende Termine zu verwalten, z.B.:

- eine Vorlesung, die immer montags 10:15-11:45 und donnerstags 08:15-09:45 stattfindet

- Stammtisch: immer am jeweils vorletzten Freitag eines Monats um 18:00

Und ich habe keine Vorstellung, wie ich das in meinem ERM (und später physischen Modell) abbilden soll... Kann mir jemand helfen?

Danke

Geschrieben

Und ich habe keine Vorstellung, wie ich das in meinem ERM (und später physischen Modell) abbilden soll... Kann mir jemand helfen?

Naja Du musst halt entsprechende Entities und in diesen die Zyklen modellieren. Es gib für so etwas kein Step-by-Step Howto, sondern man muss eben das etwas üben. Ich rate Dir zu einschlägiger Literatur und Dir ggf etwas einfachere Beispiele zum üben zu suchen

Geschrieben
Naja Du musst halt entsprechende Entities und in diesen die Zyklen modellieren. Es gib für so etwas kein Step-by-Step Howto, sondern man muss eben das etwas üben. Ich rate Dir zu einschlägiger Literatur und Dir ggf etwas einfachere Beispiele zum üben zu suchen

Hallo! Verstehe mich bitte nicht falsch, aber ich finde Deine Anwort nicht gerade aufschlussreich.

Gut, nun weiß ich, dass es kein Step-by-Step Howto für diese Fragestellung gibt, dass ich gute Bücher brauche und zu üben habe und dass man "entsprechende Entities" modellieren muss, um ein ERM zu erstellen.

Aber vielleicht hat jemand auch einen konstruktiven Vorschlag, wie man das Problem lösen kann? Danke im Voraus!

Geschrieben

Hi,

man darf hier nicht den Fehler machen flexible Datumsberechnungen als Ergebnis in die Datenbank abzulegen. Vielmehr müssen dort Informtionen gespeichert werden, mit der die darauf zugreifende AW etwas anfangen kann.

Grundsätzlich setzt sich ein Serientermin ja aus drei teiolen zusammen:

  1. Das Startdatum
  2. Das Intervall
  3. Endedatum bzw. Anzahl der Intervalle

Das Startdatum und die Länge des Serientermins dürften einfach sein. Interessanter wird es beim Intervall. Hier muss die Anwendung sich merken welches Intervall der Anwender über die Oberfläche eingegeben hat. So könnte LF2M z.B. bedeuten, der Letzter Freitag, alle zwei Monate. Eine reine Auswertung über SQL ohne Hilfe der AW ist damit natürlich nicht mehr möglich, aber bei der vielzahl von Kombinationsmöglichkeiten die es gibt, denke ich, dass das ein sinnvoller Kompromiss zwischen Normalisierung, Komplexität und Wartbarkeit ist.

Den Termin (also mit Ort, Teilnehmer etc.) würde ich in einer eigenen Tabelle ablegen und die Serieninformtion in eine seperate Tabelle auslagern. Damit ist es dann auch möglich ausserhalb der Serie Ausnahmen einzustellen: Z.B. Jeden ersten Samstag im Monat aber zusätzlich auch am 25. August.

Wenn du das als Übungsaufgabe machst, sollte dir bewußt sein, dass man mit Datumsanwendungen sehr schnell eine hohe Komplexität in die Anwendung bringen kann.

Dim

Geschrieben

Was hast du bist jetzt schon erstellt? Wie flexibel muss die Wiederholungsfunktion sein?

Auf die schnelle würde ich sagen das drei Tabellen hier ausreichen. Die erste Tabelle ist das Event selbst mit ein paar wichtigen Daten. An diese Tabelle würde ich 1:n eine Tabelle mit weiteren Daten hängen. z.B. die Kategorie(n)

Als letztes würde ich auch an die Tabelle Event noch eine weitere Tabelle 1:n hängen mit dem Wiederholungsmuster sollte es vorhanden sein.

Geschrieben

Danke für Eure Antworten!

Wenn du das als Übungsaufgabe machst, sollte dir bewußt sein, dass man mit Datumsanwendungen sehr schnell eine hohe Komplexität in die Anwendung bringen kann.Dim

Es halndet sich nicht um eine Übungsaufgabe, sondern um eine PHP&MySQL-basierte Intra-/Internet-Anwendung mit Kalender-Funktionalität.

Wie flexibel muss die Wiederholungsfunktion sein?

So flexibel, wie möglich. Viel zu unpräzise für eine Anwendungsanforderung, ich weiß.

Was haltet Ihr von folgender Struktur (s. Anhang): drei Tabellen (oder vier -- wenn man die Aktivitätsdaten auslagert)

aktivitaet: eine (abstrakte) Aktivität -- mit Start- und Enddatum

termin: ein (konkreter) Fall einer Aktivität -- mit Datum und Start- und Endzeiten

turnus: Turnus; z.B. LF2M ("der letzte Freitag, alle zwei Monate")

Allerdings heißt es ja, die Logik fast komplett auf die Anwendungsebene zu verlagern. Damit habe ich ein Problem -- v.a. weil dann die logische Verbindung zwischen dem Turnus und den Terminen nicht abgebildet wird. Und das hat u.a. zur Folge, dass Termine einzeln abgespeichert werden müssen und die Datenbank bei Aktivitäten ohne "bis"-Angabe unnötig mit vielen-vielen Zukunftsterminen zugemüllt wird.

Was sagt Ihr?

post-53902-14430448485474_thumb.png

Geschrieben

Es halndet sich nicht um eine Übungsaufgabe, sondern um eine PHP&MySQL-basierte Intra-/Internet-Anwendung mit Kalender-Funktionalität.

Überlege Dir bitte, da Du anscheinend noch nicht so viel Erfahrung hast, ob es wirklich eine gute Idee ist, dieses Projekt so umzusetzen. Gerade mit SQL Injections kannst Du Dir sehr große Probleme einhandeln, ebenso wie nicht richtig modellierte Tabellen / Beziehungen.

Ich würde Dir zu entsprechenden fertigen Systemen raten

Allerdings heißt es ja, die Logik fast komplett auf die Anwendungsebene zu verlagern. Damit habe ich ein Problem -- v.a. weil dann die logische Verbindung zwischen dem Turnus und den Terminen nicht abgebildet wird. Und das hat u.a. zur Folge, dass Termine einzeln abgespeichert werden müssen und die Datenbank bei Aktivitäten ohne "bis"-Angabe unnötig mit vielen-vielen Zukunftsterminen zugemüllt wird.

Ich halte nichts davon die Logik in die Anwendung zu legen, denn bei entsprechendem Datenvolumen gehört eine solche Auswertung in das DBMS. Ich würde hier auch zu Stored Procedures raten, mit der sich solche Dinge innerhalb der Datenbank realisieren lassen, ob dann mySQL eine gute Wahl ist, würde ich gerade im Bereich der Stored Procedures eher nicht so sagen, sondern hier auf andere Systeme z.B. Postgresql mit Python oder MS SQL setzen. PHP bietet auch dazu entsprechende Schnittstellen an

Geschrieben
Überlege Dir bitte, da Du anscheinend noch nicht so viel Erfahrung hast, ob es wirklich eine gute Idee ist, dieses Projekt so umzusetzen. Gerade mit SQL Injections kannst Du Dir sehr große Probleme einhandeln, ebenso wie nicht richtig modellierte Tabellen / Beziehungen.

Ich würde Dir zu entsprechenden fertigen Systemen raten

SQL Injections sind ein allgemeines Problem bei datenbankbankbasierten Anwendungen, das ich wohl in jedem Fall haben werde -- ob mit Planer-Funktionalität oder ohne. Trotzdem ist die Idee, auf eine fertige Lösung zurückzugreifen, natürlich sinnvoll. Welche Kalender/Planer würdest Du empfehlen?

Geschrieben
ich habe recht gute Erfahrungen mit der Groupware eGroupWare: Home gemacht. Synchronisation auch mit Outlook und OSX Mail / Evolution kein Problem.

OK, danke für den Hinweis.

Auf dem Diagramm von gestern ist eine Beziehung verkehrt rum gezeichnet. Jetzt habe ich das korrigiert und lade das Modell nochmal hoch. Würde gerne Eure Meinung zum Diagramm wissen. Danke.

post-53902-14430448486019_thumb.png

Geschrieben

Einen Tipp habe ich noch schaue dir doch mal Datenbanken bzw Modell von bestehenden Anwendungen an. Da kannst du dir vielleicht ein paar Anregungen holen. Sunbird z.B. hat in meinen Augen schon die Funktionen zur Wiederholung die du benötigst und dieser nutzt zur Speicherung auch eine SQLite Datenbank die kannst du dir ja mal anschauen und sehen wie die es gemacht haben.

Geschrieben

Gute Idee! Aber ich komme nicht an das Datenmodell bzw. die Daten von Sunbird. Ich habe es nämlich mit SQLite Manager (Firefox Add-On) versucht, aber er findet keine *.sqlite-Dateien im Profile-Verzeichnis. Weißt Du, wo bei Sunbird die Daten abspeichert werden und wie man sich die Tabellen anzeigen lassen kann?

Geschrieben

Die Datenbank liegt in deinem Profilordner und heißt storage.sdb die sollte sich mit jedem Programm welches SQLite Datenbanken öffnen kann lesen lassen.

Die Datei liegt in XP meist unter C:\Documents and Settions\<UserName>\Application Data\Mozilla\Sunbird\Profiles\<profilname>. Unter Vista liegt sie meist C:\Users\<UserName>\AppData\Roaming\Mozilla\Sunbird\Profiles\<profilname>.

Solltest du die nicht finden einfach mal nach der Datei suchen.

Geschrieben

Danke! Hat geklappt!

Komische Datenbank... Von den 13 Tabellen ist in keiner einzigen ein Fremdschlüssel definiert. Die Beziehungen lassen sich gar nicht nachvollziehen.

Die Tabelle mit den Terminen heißt cal_events. Wenn ich bei einem Termin den Typ der Wirderholung ändere, verändert sich (manchmal!) der Wert in deren Spalte flags. So hat die Spalte bei "Wiederholt sich nicht" der Wert 4 und bei "Täglich"/"Wöchentlich"/"Jeden Werktag" etc. den Wert 20. Also dachte ich zunächst, das wäre ein Fremdschlüssel, der die Tabelle mit einer "Turnus"-Tabelle verbindet. Letztere konnte ich aber leider nicht finden.

Geschrieben

Die Tabelle mit den Terminen heißt cal_events. Wenn ich bei einem Termin den Typ der Wirderholung ändere, verändert sich (manchmal!) der Wert in deren Spalte flags. So hat die Spalte bei "Wiederholt sich nicht" der Wert 4 und bei "Täglich"/"Wöchentlich"/"Jeden Werktag" etc. den Wert 20. Also dachte ich zunächst, das wäre ein Fremdschlüssel, der die Tabelle mit einer "Turnus"-Tabelle verbindet. Letztere konnte ich aber leider nicht finden.

Das kann auch eine Codierung sein. Z.B. werden in der Unixwelt die Rechte als Octalwerte abgespeichert, nur weil da z.B. 755 steht, muss das nicht der dezimalen Zahl 755 entsprechend. Je nach Datentyp des Feldes kann auch eine bitweise Codierung vorgenommen worden sein. Gerade bei SQLite sollte man im Hinterkopf haben, dass die Datentypen dynamisch sind: SQLite ? Wikipedia

Jede Spalte kann Daten beliebiger Typen enthalten, erst zur Laufzeit wird nötigenfalls konvertiert.
Geschrieben

Komische Datenbank... Von den 13 Tabellen ist in keiner einzigen ein Fremdschlüssel definiert. Die Beziehungen lassen sich gar nicht nachvollziehen.

Das ist auch verständlich denn SQLite ist für den Embedded-Einsatz gedacht daher werden nicht alle Funktionen die du kennst unterstützt. z.B. fehlt die Funktionen für die Referentielle Integrität also die FOREIGN KEY Definition beim erzeugen der Tabelle.

Für den Turnus/ Wiederholung ist die Tabelle cal_recurrence verantwortlich und diese hängt an der Tabelle cal_events . Auf den ersten Blick würde ich sagen das die Felder cal_id und id als Primärschlüssel genutzt werden.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...