Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: SQL: Tabellenaufbau Kalender
AUTOR BEITRAG
Carlos

RANG Deckschrubber

#1 - 08.02 22:03

Ich bin gerade dabei so eine Art Kalender zu programmieren. Im Moment bin ich dabei mir Gedanken über den Aufbau der Datenbank zu machen. Ich habe n User, maximal m Einträge pro Tag und l Tage.

Wenn die Datenbank jetzt 5 Jahre läuft(wird sie nicht) und z.B. 1000 User hätte(wird sie auch nicht), dann hätte ich bei geschätzten 200 Einträgen pro Jahr 5*200*1000 = 1.000.000 Einträge über die jede Anzeige, ob "Januar 2007" oder "14.02.2007 14.00 Uhr – 14.30 Uhr" (interne Optimierung mal ignoriert) rüberrattern müsste. Hat irgendwer eine Idee, wie man so etwas effizienter implementieren könnte? Ich steh irgendwie echt grad auf dem Schlauch.
stud. iur. klaustopher

RANG Master of Luck

#2 - 09.02 02:46

Tabelle:
id, uid, datum, titel, uhrzeit

PRIMARY_KEY(id)
INDEX (uid, datum)

und dann die Querys

Alle Einträge eines Monats: SELECT * FROM tabelle WHERE uid!= 0 AND MONTH(datum)==1 AND YEAR(datum)==2007
Alle Einträge eines Users pro Monat: SELECT * FROM tabelle WHERE uid== $deine_id AND MONTH(datum)==1 AND YEAR(datum)==2007

usw usf ... wenn du vor so einen Query ein EXPLAIN schreibst, dann siehst du über welche indizies der Query ausgeführt wird, und wenn dort alle Argumente der WHERE Bedingung erfasst sind, dann ist dein Query gut, und dann arbeitest du mit guter Performance. Dann sind auch 1mio Einträge kein Ding
*al!ve* - Vorbereitung aufs Urlaubssemester

RANG Master of Clanintern

#3 - 09.02 10:45

Je nachdem wie komfortabel man das will kommt da aber schnell mehr. Sich periodisch wiederholende Termine (jede Woche, 14-Täglich, jeden ersten und dritte Montag im Monat, etc) mit Start- und Endzeitpunkt (also nur alle 14 Tage beginnend mit dem 9.2.07 bis zum 31.5.2007 oder sowas). Ausnahmeregeln für diese periodischen Termine (am 23.3.07 geht nicht weil xyz).
horst

RANG Prophet of Clanintern

#4 - 09.02 10:51

Wozu gibt's denn iCal
*al!ve* - Vorbereitung aufs Urlaubssemester

RANG Master of Clanintern

#5 - 09.02 11:13

Toll, jetzt wollt ich den Beitrag ändern ...

iCal is blöd weil das sehr sehr groß und sehr sehr unhandlich wird, wenn man viele Termine hat. Nicht umsonst frickeln Mobiltelefone nicht mit iCal sondern SyncML herum. Da kann man immerhin definieren, welche Zeitabschnitte man betrachten will anstatt jedes mal den kompletten Kalender laden zu müssen. Auch "gib mir alle Einträge, die seit dem 1.2.07 in den Kalender eingetragen wurden" geht bei SyncML, bei iCal natürlich nicht.



Folgendes wollte ich im anderen Post ändern:

quote:
Je nachdem wie komfortabel man das will kommt da aber schnell mehr. Sich periodisch wiederholende Termine (jede Woche, 14-Täglich, jeden ersten und dritte Montag im Monat, etc) mit Start- und Endzeitpunkt (also nur alle 14 Tage beginnend mit dem 9.2.07 bis zum 31.5.2007 oder sowas). Ausnahmeregeln für diese periodischen Termine (am 23.3.07 geht nicht weil xyz).

Um das ganze ein wenig unter Kontrolle zu bringen könnte man alle Termine unabhängig von der Zeit in einer Terminbeschreibungstabelle speichern und jeweilige Einplanungen dieses Termins in einer Terminzeittabelle.


Tabelle terminbeschreibung:
id (Primärschlüssel), titel, beschreibung, start, ende

Tabelle terminzeit:
id, beschreibung_id (Fremdschlüssel auf terminbeschreibung.id), titel, beschreibung, start, ende, status


start und ende in der Terminbeschreibung sind keine Uhrzeiten sondern Tage. Der Termin findet vom 9.2.07 bis zum 31.5.07 statt.
Jede konkrete Ausprägung des Termins bekommt nen eigenen Eintrag in terminzeit, also der 9.2., der 23.2., der 9.3., der 23.3., der 6.4., der 20.4., der 4.5. und der 18.5.

Der Status in terminzeit definiert drei Stufen der Verbindlichkeit ("ich kann mir vorstellen", "vermutlich" und "definitiv") sowie zwei Stufen von "fällt aus" ("fällt aus weil findet nicht statt" und "fällt aus weil anders entschieden").

Ausnahmen in periodisch auftretenden Terminen sind "fällt aus weil findet nicht statt", jedes andere "fällt aus" ist das "anders entschieden".
Begründung dafür: "anders entschieden" kann ich mir im Kalender evtl einblenden wollen weil ich die "Andersentscheidung" wieder rückgängig machen möchte. Vielleicht trag ich mir irgend nen Geburtstag bewusst und schon drei Jahre vorher als "verworfen" ein und will dann spontan doch hin. Wäre blöd, wenn ich dann erst anrufen müsste und fragen wann derjenige Geburtstag hat.

titel und beschreibung sollten selbsterklärend sein. Jeder Termin hat sowas ("Englischunterricht" oder sowas), jede konkrete Ausprägung dieses periodischen Termins bekommt zusätzlich noch nen Kommentar, weil es eben sowohl Notizen gibt die alle Ausprägungen des Termins betreffen ("Raum A123, Lehrerin Frau Müller") als auch welche, die nur eine Ausprägung betreffen ("Tintenkiller mitbringen weil Schulaufgabe").


Und jetzt darf mal jemand die Überschneidung zweier Termine berechnen, wenn der eine am 10.2.07 um 20:00 anfängt und am 12.2.07 um 15:00 endet weil se Geburtstagsfeier mit Suff und Übernachtung ist, der andere am 11.2.07 von 20:00 bis 22:00 stattfindet weil irgend was im TV läuft. Das wird *enorm* umständlich, sowas zu ermitteln.

Um das zu umgehen könnte man anstatt Start- und Endzeitpunkte für Terminausprägungen zu vergeben auch einfach Fünfminutenblöcke an Zeit vergeben. Eine Englischstunde bekommt dann halt 18 Einträge weil 90 Minuten mal so viele Fünfminutenblöcke sind.
Da das allerdings die Blocktabelle sehr sehr aufbläht könnte man eine extra Blocktabelle anlegen, dort alle Termine ohne Beschreibung und sonstwas nur mit "Referenz auf Terminausprägung" und der jeweiligen Blockzeit (Tag und Uhrzeit, wann der Fünfminutenblock anfängt) speichern. So braucht man beim Eintragen eines neuen Termins nur drauf achten, dass keine zwei Blöcke die selbe Zeit beanspruchen. Was man aber auch nicht komplett ausschließen darf, weil die Müllabfuhr sehr gerne um 10:00 kommen darf wärend ich grade in nem Meeting bin.
Die Performance wird vermutlich in den Keller gehen wenn man das so macht. Evtl kann man dem ein wenig entgegenwirken, indem man alle schon abgehandelten Blöcke aus der Blocktabelle entfernt. Eine Überschneidung die ich heute für gestern eintrage is mir recht wurscht.
horst

RANG Prophet of Clanintern

#6 - 09.02 11:35

Ich schätze, dass Handy Hersteller damit "rumfrickeln", weil es genau dafür gedacht ist Und iCal ist nicht blöd. So.
*al!ve* - Vorbereitung aufs Urlaubssemester

RANG Master of Clanintern

#7 - 09.02 11:39

Für mich wäre das absolute Killerfeature eines Kalenders, wenn ich ihm per E-Mail Einträge zuschieben könnte.

Eigentlich braucht so n Ding ohnehin ne Schnittstelle, um mit beliebigen Clients da drauf gehen zu können. Man *könnte* den Kalender ohne GUI basteln, lediglich irgend ne einfache, textbasierte Schnittstelle dazu entwerfen. Wenn die Basis gut gemacht ist und sicher und stabil läuft ist das schon viel Wert. Dazu darf man dan beliebige UIs schreiben. In eigenständiger Client meinetwegen in Java oder c#, n Webfront, n WAP-Front, n Thunderbird- oder Firefoxplugin oder eben was consolenähnliches, was via E-Mail Befehle von mir empfängt.



*träum*


Mail von mir:
>show from 09.02.2007 0:00 to 09.02.2007 23:59

Mail vom System zurück, das denheutigen Tageskalender enthält

Mail von mir:
>enter description "Kneipenbesuch Strohalm" from 09.02.2007 to 31.12.2007

Mail vom System zurück:
>Description entered: "Kneipenbesuch Strohalm" from 09.02.2007 to 31.12.2007 [id 12345]

Mail von mir:
>enter schedule "offene Bühne" from 07.02.2007 20:00 to 08.02.2007 2:00 for 12345
>enter schedule "offene Bühne" from 14.02.2007 20:00 to 15.02.2007 2:00 for 12345
>enter schedule "offene Bühne" from 21.02.2007 20:00 to 22.02.2007 2:00 for 12345

Mail vom System zurück:
>Schedule entred: "offene Bühne" for "Kneipenbesuch Strohalm" from 07.02.2007 20:00 to 08.02.2007 2:00
>Schedule entred: "offene Bühne" for "Kneipenbesuch Strohalm" from 14.02.2007 20:00 to 15.02.2007 2:00
>Schedule entred: "offene Bühne" for "Kneipenbesuch Strohalm" from 21.02.2007 20:00 to 22.02.2007 2:00


Ach ja, so wär das geil ...
horst

RANG Prophet of Clanintern

#8 - 09.02 11:45

Outlook kan das sogar. Nennt sich "Meeting Request"
*al!ve* - Vorbereitung aufs Urlaubssemester

RANG Master of Clanintern

#9 - 09.02 11:58

Um den Hintergrund zu erklären: Ich will über das WAP-Portal von O2 von meinem Handy aus E-Mails an den Kalender verschicken bzw die E-Mails dieses Kalenders über eben das WAP-Portal lesen. 3€ monatlich für ne Mail-Flatrate wollen genutzt werden. Oder alternativ sich mal in die Materie Handyprogrammierung einarbeiten und n Java-App schreiben, das auf das O2 Wap-Portal verbindet und über den Mailingdienst eben diese Mails verfasst.
*al!ve* - Vorbereitung aufs Urlaubssemester

RANG Master of Clanintern

#10 - 13.02 19:42

Ja wie sieht s aus, is hier nix mehr los?
masta // thomas

RANG Prophet of Clanintern

#11 - 14.02 23:12

warum baust du dir dein programm dann nicht?
*al!ve* - Vorbereitung aufs Urlaubssemester

RANG Master of Clanintern

#12 - 15.02 08:59

Siehe SW/HW-Forum. Ich bin schon dabei. Die Tabellenstruktur steht und ein Projektemanagement mit Stundenabrechnung hab ich auch schon gedanklich integriert.

Als Nächstes überleg ich mir, wie ich am sinnvollsten zwischen Model und View interagiere. Nachdem auf den Kalender nicht nur ne Web-App Zugriff haben soll sondern evtl auch ne standalone-App oder ne Firefox-Extension wird da irgend n Standard verwendet oder erfunden der auf Browser-Requests basiert. Bisher bin ich bei SOAP, aber das wäre doch recht viel Aufwand, da hinreichend viel zu implementieren. Vielleicht verschieb ich auch nur serialisierte Anfrage- und Antwortarrays über ne Socketverbindung.
code:

Anfragearray[0]['name'] = 'ein_funktionsname';
Anfragearray[0]['parameter'][0] = 'erster Parameter';
Anfragearray[0]['parameter'][1] = 'zweiter Parameter';
Anfragearray[0]['parameter'][2] = 'dritterParameter';
Anfragearray[1]['name'] = 'n_zweiter_funkttionsname';
Anfragearray[1]['parameter'][0] = true;

Antwortarray[0] = 'Antwort';
Antwortarray[1] = false;


Serialisieren und deserialisieren dürfte sich auch in anderen Sprachen recht leicht bewerkstelligen lassen und ich muss nicht n heiden Aufwand in das Ding stecken, ohne dass der Kalender überhaupt geht. N richtiger XML SOAP is mir wie gesagt zu groß und zu umfangreich.

Diagramm folgt


[edit]


Grad über die Authentifizierung des Clients gegenüber dem Server nachgedacht. Ich will kein Klartextpasswort schicken, SSL kommt allerdings nicht in Frage.

Der Server sendet einen Auth-Request mit folgendem Inhalt:
code:
auth[0]='Benutzername';
auth[1]=zufall_request_stoken(); //md5(crypt(microtime())) oder sowas
auth[2]=md5(auth[0].auth[1].'Passwort')


Der Server nimmt das Array auseinander und prüft, ob das MD5 stimmt. Daraufhin antwortet der Server mit einem TAN-Array aus 100 Zufallstokens und merkt sich die natürlich selbst. Der Client merkt sich alle 100 geschickten Zufallstokens.
Weiterhin speichert sich der Server alle bisher verwendeten Zufallsrequesttokens eines Benutzers, damit ein und dieselbe Authentifikationsanfrage nicht mehrfach gestellt werden kann.

Der Client schickt daraufhin jede Anfrage als

code:
$anfrage[0]='Benutzername';
$anfrage[1]=$tan_token[$i];
$anfrage[2]=$anfragerequest; // Anfrage gemäß obigem Schema
$anfrage[3]=md5($anfrage[0].$anfrage[1].unserialize($anfrage[2]));

Der Server streicht bei jeder Anfrage den entsprechenden Tan-Token aus seiner Liste, generiert einen neuen und schickt den in der Antwort zurück.