Projekt mit CCK machbar? Interessanter Projektbeschrieb
am 25.01.2008 - 21:46 Uhr in
Hallo Dupal-Spezialisten!
Ich habe mich nun mehrere Tage mit drupal auseinandergesetzt und sehr viel gelesen. Ich möchte eine bestehende Datenbank mit Webinterface auf eine neues technisches Framework migrieren.
Da Drupal sich sehr gut entwickelt, Richtung Web 2.0 geht und viele interessante Features hat, habe ich meine Spezifikationen auf ihre technische Machbarkeit geprüft.
Kleiner Projektbeschrieb:
- High Performance Anforderungen (>50'000 Hits pro Tag)
- Datenbank mit mind. 3 Million Datensätze pro Tabelle
Beispielhaftes Datenmodell mit fiktiven Entitäten:
- Autor mit Attributen
- Buchtitel mit Attributen
- Buchsammlungen mit Attributen.
Beziehungen:
- Eine Buchsammlung besteht aus mehreren Buchtiteln.
- Eine Buchsammlung gehört zu einem Autor
- Ein Buch gehört zu einem Autor, d.h. es gibt Bücher die in einer Sammlung sind und solche die es nicht sind.
Und zuletzt das wichtigste
- Ein Buchtitel kann in mehreren Buchsammlungen enthalten sein.
Das Datenmodell der bestehenden DB sieht wie folgt aus:
- Table author mit authorID als Primary Key
- Table bookTitle mit bookID als Primary Key
- Table bookGroup mit bookGroupID
- Table bookGroupRel mit bookGroupID und bookID als kombinierter Primary Key
Nach dem Studium der gesamten Dokumentation und der Handbücher bin ich auf folgende mögliche Implementierung mit drupal gekommen.
Autor, Buch, Buchsammlung sind eigene Content Types die ich mit CCK erstellen könnte.
Nun tauchen die ersten Fragen auf:
1) Wie realisiere ich möglichst performant die N:M Beziehung? Das gleiche Buch kann in mehreren Sammlungen sein und pro Buch gibt es genau einen Autor. Ich kann ja nicht einen ContentType für die Relation Tabelle erstellen mit dem kombinierten Primary Key?
2) Angenommen ich kann die obige Herausforderung lösen, was ist der korrekte Weg zum importieren der oben beschriebenen Struktur in Drupal? Muss ich zuerst Nodes anlegen, dann für die Node die jeweiligen Content Types anlegen?
3) Ich möchte eine Page wo die Details eines Autors angezeigt werden. Dort werden alle Bücher, sowie alle seine Büchersammlung mit den dazugehörigen Büchern gezeigt. Gibt es für jede dieser Detailpages ein neuer Node? Ich frage, weil ich unbedingt ein URL Rewriting einsetze (Bsp: www.example.com/author/name/12345 wobei 12345 die Autor-ID ist)?
4) Wie kann ich eine Seite erzeugen, die sich aus verschiedenen Content Types zusammensetzt ist? Bekomme ich mit Views keine Performanceschwierigkeiten?
Und nun die letzte und wichtigste Frage:
Beim Lesen der Dokumentation habe ich viele tolle Features gefunden, die ich verwenden möchte unter anderem Kommentare zu Content Types, die Voting API zu Content Types. Ganz besonders gut gefallen hat mir die Taxonomie, mit denen ich meine Content Types klassifizieren könnte.
5) Gibt es einen Weg, wie ich alle die Vorteile von Drupal nutzen könnte und TROTZDEM die alte Datenbank mit dem bestehenden Datenbankschema beibehalten könnte?
Ich habe gesehen, dass man im Code die die DB wechseln kann, bin mir aber ziemlich sicher, dass ich dann Module wie pathauto, Taxonomie und Kommentare nicht verwenden kann, wenn ich keine Content Types anlege...
Für Erfahrungsberichte und jegliche Art von Hinweisen bin ich äusserst dankbar! Auch kritische Gedanken, falls drupal nicht die geeignete Lösung ist.
- Anmelden oder Registrieren um Kommentare zu schreiben
zu 1.) Die Beziehung Buch zu
am 25.01.2008 - 22:30 Uhr
zu 1.)
Die Beziehung Buch zu Sammlung kannst du über Node Reference mit CCK abbilden. Einer Sammlung kannst du dann beliebig Bücher zuordnen. Ebenso verhält es sich mit Büchern und Autoren (in der realen Welt hat ein Buch gerne mehr als einen Autor und ein Autor schreibt öfter mal mehr als nur ein Buch).
zu 2.)
Zunächst definierst du deine Content Types und prüfst durch Tests die korrekte Funktion. Wenn alles zufriedenstellend funktioniert fliegen die Spieldaten raus und du überlegst dir eine Import-Routine auf Basis der durch das Anlegen der Content Types generierten Tabellen.
zu 3.)
Ist "nur" eine Sache des Themings des Inhaltstyps "autor".
zu 4.)
Beispiel?
Vies sind eine visuelle Hilfestellung zur Erstellung mehr oder minder einfacher Abfragen.
zu 5.)
Klar kannst du auch die bestehenden Daten beibehalten. Du kannst beliebig externe (Nicht-Drupal-) Datenbanken benutzen. Du kannst natülrich ein eigenes Modul entwickeln, dass deine vorhandene DB.Struktur übernimmt, kannst dir darauf aufbauende Content Types entwicklen, usw. usf. Es gibt diverse 3rd Party Systeme die durch Module in Drupal integriert werden.
Beschränkt werden die Möglichkeiten nur durch die eigene Phantasie, die vorhandenen Skills und die üblichen Ressourcen (Zeit, Geld).
Die Frage ist nicht so sehr ob Drupal für dein Projekt und dich geeignet ist, sondern ob du für Drupal geeignet bist ;)
--
"Look, Ma, I'm dead!"
Cell, Stephen King
Suchmaschinenoptimierung (SEO) & Drupal
Hallo Alexander Besten Dank
am 27.01.2008 - 15:53 Uhr
Hallo Alexander
Besten Dank für deine Antworten. Ich erlaube mir noch ein paar Fragen detaillierter nachzufragen.
zu 1)
Wie genau kann ich das mit node references abbilden? In der Datenmodell beschreibung habe ich ja erwähnt, dass ich eine Tabelle habe, die nur die Relation zwischen Buchsammlung und Buch beschreibt. Diese Tabelle hat nur zwei ID Felder, die zusammen den Primary Key ergeben. Muss ich jetzt einen Content Type für diese Relation Tabelle machen oder löse ich das anders? Die Verbindungstabelle ist meiner Meinung nach der performanteste Weg und ergibt keinerlei Nullwerte in der Tabelle (falls z.B. ein Buch zu keiner Sammlung gehört). Ich bin gespann auf genauere Erklärungen.
3) Kann ich beim Theming vom Content Type autor auch auf beliebige Verknüpfte Tabellen ohne grossen Aufwand zugreifen? Hast Du hierzu ein Code-Beispiel?
4) Hier sprichst Du einein wichtigen Punkt an: Wie ist es möglich, einen Content Type in Drupal zu implementieren, dessen Datenfelder auf einer externen Datenbank beruhen? Wenn ich das realisieren könnte, dann könnte ich mir viel Arbeit ersparen. Gibt es vielleicht ein Modul, wo jemand etws ähnliches gemacht hat? Damit ich den SOurce COde studieren könnte?
Vielen Dank für deine Antworten!
also ich würde da sagen, es
am 27.01.2008 - 17:58 Uhr
also ich würde da sagen, es geht nur über ein eigenes Module für einen eigenen Contenttyp.
Dort kann man dann auch sehr gut vorhandene Tabellen nutzen und beliebig verknüpfen
--------------
Mein Blog: www.freeblogger.org
Deutscher IRC-Channel: irc.freenode.net #drupal.de je mehr desto besser
... Jabber-me: dereine@jabber.ccc.de Warum Jabber?
Ok, besten Dank für den
am 28.01.2008 - 10:55 Uhr
Ok, besten Dank für den Input.
Wenn ich das richtig verstanden habe, mache ich ein eigenen Content Type. Das ganze realisiere ich als Module.
Kannst Du mir einen Tipp geben, wie ich am besten anfange? Gibt es z.B. irgendwo ein Tutorial, das beschreibt, wie man ein Modul mit einem eigenen Content Type anlegt?
Oder gibt es allenfalls schon ein Modul in der Datenbank, dass etwas ähnliches macht, dass ich mir anschauen könnte?
Ich habe gesehen, dass es sehr viele Module mit Feldtypen gibt. Das ist aber nicht das, was ich benötige, obwohl ich grundsätzlich die Feldtypen auch gerne eingesetzt hätte (Passwortfeld, Image Feld etc).
Wer gibt mir den entscheidenden Tipp?
Vielen Dank!
CKK/Views
am 28.01.2008 - 11:04 Uhr
Du benötigst wahrscheinlich kein eigenes Modul, sondern kannst mit CKK einen eigenen Contentypen anlegen. In diesen nimmst du die CKK-Felder (Module vorher durchschauen und installieren) auf, die deinenn Zwecken entsprechen. Es gibt zudem das Computed Field, mit dem du php-Schnippsel nutzen kannst. Alles in nur einem über die Weboberfläche zusammenbaubaren Inhaltstyp. Die Inhalte selbst kannst du mit Views so ausgeben, wie du sie benötigst und mit Content Template oder per eigenes Nodes-Template so gestaöten, wie du möchtest. Wirklich gute Screencast-Tutorials in Englisch gibt es über drupal.org zu finden.
Ohne Modul wäre alles viel
am 29.01.2008 - 22:19 Uhr
Ohne Modul wäre alles viel einfacher. Die Frage ist nur, wie kann ich ohne Module die M:N Relation abbilden? Wenn mir diese Frage klar ist, dann käme ich einen Schritt weiter..
Taxonomy?
am 31.01.2008 - 18:41 Uhr
Ich bin nun wahrlich kein Programmierexperte, deshalb werfe ich nur mal in den Raum, mit Taxonomy zu arbeiten. Mal unabhängig von älteren Daten. Wenn du jetzt neu anfangen würdest, könntest du Buch-Nodes anlegen, dazu den Autor oder die Sammlung als Taxonomy-Term. Eventuell beides. Damit müsste man ziemlich weit kommen, da man die Taxonomy-Begriffe sehr gezielt einsetzen und aufrufen kann. Man kann prinzipiell auch Nodes zu Autoren zusätzlich anlegen und referenzieren - oder Views. Wenn das deinen Bedürfnissen entspricht würde ich die alten Inhalte importieren. Dafür wird gerade ein spezielles Datenbank-Importmodul geschrieben, das meine Inhalte in Drupal integrieren soll. MIt zwei Datenbanken möchte ich auf Dauer nicht arbeiten, das schafft nur unnötige Fehlerquellen (für mich ;-) ).
Ich lasse mir gerade bei einem ähnlich komplexen Thema helfen. Dabei lege ich zu Produkten mit Herstellern und Verfassern Rezensionen an. Die Rezension ist ein Inhaltstyp und bindet per Taxonomybegriff Hersteller und Verfasser (nicht Beitragsautor) mit Freetagging ein. Diese Begriffe lasse ich unter dem Text anzeigen. Beim klick auf den Namen öffnet sich der Standard-Taxonomy-View mit den Beiträgen zu diesem Hersteller bzw. Verfasser. Zusatzinfos will ich da auch noch einfügen, da habe ich mich aber noch nicht mit beschäftigt.
Wenn du eine Lösung hast, bin ich interessiert, wie du es angestellt hast, denn noch habe ich keine abschließende Struktur. :-)
also von
am 31.01.2008 - 19:39 Uhr
also von http://drupal.org/node/508 aus
solltest du zu http://drupal.org/node/162170 gehen
zu den Feldtypen: password bietet dir die Formapi, imagefeld kann man ja nachschauen in diversen ImageModulen
// man kann auch CCK und Custom Node Type mixen
--------------
Mein Blog: www.freeblogger.org
Deutscher IRC-Channel: irc.freenode.net #drupal.de je mehr desto besser
... Jabber-me: dereine@jabber.ccc.de Warum Jabber?
Millionen - Datensätze: Durchaus machbar!
am 01.02.2008 - 13:31 Uhr
Hallo,
nach meinem Verständnis und Recherchen ist so ein Projekt mit Drupal durchaus machbar:
50k Hits am Tag -> wie verteilen die sich z.B. über 10 Stunden sind ca. 1,3 Hits pro Sekunde, wahrscheinlich macht das sogar mein Notebook :-)
Tabellen mit 3 Mio. Zeilen (= Datensätze) ist kein Thema für MySQL, solange die Tabellengröße im Rahmen der Spezifikation liegt (erreichen wohl die wenigsten Anwendungen, wer es genauer wissen will schlägt in der Doku nach, die Werte sind Betriebsystem abhängig)
drupal.org lief bis vor einigen Monaten auf einem einzigen Rechner, Details: http://froscon.erdfisch.de/?q=node/5
Datenmodell:
verstehe ich nicht ganz:
sowohl Buch als auch Buchsammlung haben einen Autor;
ist mit dem Autor der Buchsammlung ein User gemeint, der eine Liste aus Büchern erstellt oder
ist die Buchsammlung eine Liste aller Bücher, die ein Autor (mit-)geschrieben hat?
(beides lösbar, jedoch bieten sich dafür andere Wege an)
Die Buchsammlung scheint bis auf die ID keine weiteren Attribute zu haben - richtig?
Ein Buchtitel gehört zu 0 bis N Buchsammlungen - verlangt also eine N:M-Relation
für diese Abbildung gibt es auch wiederum mehrere Möglichkeiten:
- Taxonomie bzw. Freetagging
- eigene Tabelle für Buchsammlungen (wie in der vorhandenen DB)
(wenn es nicht eine Ausgabe aus der Datenbank ist, die alle Bücher eines Autors selektiert)
Nodes sind quasi die Objekte, an denen die meisten Module ansetzten, wenn also Autoren, Bücher oder Buchsammlungen kommentiert werden sollen, dann müssen diese Entitäten Nodes sein.
(Ev. sind die Buchsammlungen keine Nodes) Auch die meisten anderen Module (five-star etc.) wirken auf nodes, d.h. alles worauf Module wirken sollen, muss als node dargestellt werden.
Zur Lösung mit Drupal:
Für Autor und Buch einen Content-Typ anzulegen stimme ich zu;
die Büchersammlung könnte auch ein View sein (d.h. bitte genauer beschreiben was die Büchersammlung ist, ev. welche Attribute hat die Büchersammlung, die funktional ausschließlich zur Büchersammlung gehören, z.B. ein Name der Büchersammlung)
Zu 1)
machbar mit den Feldtypen nodereference und nodereferrer (http://drupal.org/project/Modules/category/88?page=2)
Zu 2)
Reihenfolge:
Analyse der Tabellen und Felder
Installieren der CCK-Module für die Felder
Prinzipiell für jede Tabelle von Entitäten einen Inhaltstyp erstellen, mit den zugeordneten Feldern
Import:
http://www.drupalcenter.de/node/41
Zu 3)
Klingt nach einem View; Auch Views können URLs zugeordnet werden, bzw. URLs für Views können Attribute enthalten, die Attribute der Abfrage darstellen (z.B. Autor)
Zu 4)
Views macht das.
Zu 5)
Auch das ist möglich, am einfachsten mit einem eigenen Modul, ev. auch über Views auf der Datenbankebene (= virtuelle Datenbankinhalte, die real in einer anderen Datenbank liegen).
Fazit:
Drupal ist sicherlich eine Lösung, wenn Web 2.0 Element gesucht werden sicherlich eine der Besten.
Thomas Zahreddin
____________________________
IT + Künste + Organisation ==> http://www.it-arts.org
Thomas Zahreddin