Problem beim logischen Aufbau einer Datenbank
Flo
- datenbank
Hallo Leute,
ich hätte da folgendes Problem:
ich möchte ne datenbank erstellen, die aufgebaut ist praktisch wie ein Forum, wird aber keins ;)
aufgebaut in der Form
-Titel
-Überschrift
-Text
-Überschrift
-Text
usw...
Das Problem ist nun, wie ich die Datenbank aufbauen soll. Es wäre kein Problem wenn zu jedem Titel jeweils nur eine Antwort kommen würde, aber wie soll ich es machen, dass dann dahinter noch mehr Antworten hinzugefügt werden können, und dann nachher wieder ausgelesen werden können?!
Die Datenbank wird MySQL, Applikationssprache wird PHP sein....
Wäre nett wenn ihr mir da ein paat Tipps geben könntet
MfG
Flo
Hallo Leute,
ich hätte da folgendes Problem:
ich möchte ne datenbank erstellen, die aufgebaut ist praktisch wie ein Forum, wird aber keins ;)
aufgebaut in der Form-Titel
-Überschrift
-Text
-Überschrift
-Textusw...
Das Problem ist nun, wie ich die Datenbank aufbauen soll. Es wäre kein Problem wenn zu jedem Titel jeweils nur eine Antwort kommen würde, aber wie soll ich es machen, dass dann dahinter noch mehr Antworten hinzugefügt werden können, und dann nachher wieder ausgelesen werden können?!
Die Datenbank wird MySQL, Applikationssprache wird PHP sein....
Wäre nett wenn ihr mir da ein paat Tipps geben könntet
MfG
Flo
Wenn ich dich richtig verstanden habe, ist dein Problem,
daß du bei mehreren gleichen Titeln den Titel einmal hinschreiben willst und dann alle dazugehörigen ds?
Bsp:
Titel 1
MeldungzuTitel1
MeldungzuTitel1
MeldungzuTitel1
Titel 2
MeldungzuTitel2
MeldungzuTitel2
usw.
Du kannst ruhig ein Feld nehmen, welches jeweils den Titel beinhaltet, dann:
// deine query
if ($row=mysql_fetch_array($result))
{
$altertitel=$row[titel]; //muß einmal zu anfang gesetzt werden
do
{
if ($altertitel!=$row[neuertitel]) // gabs den Titel schonmal?
{
echo"$row[titel]<br>\n"; //gabs noch nicht, also hinschreiben
echo"$row[ueberschrift]<br>\n";
echo"$row[deintext]<br>\n";
$altertitel=$row[titel]; //neuer alter titel
}
else //titel war schon da, also nur inhalte schreiben
{
echo"$row[ueberschrift]<br>\n";
echo"$row[deintext]<br>\n";
}
}
while ($row=mysql_fetch_array($result));
}
(ungeprüft!)
Also: der jeweils letzte titel wird in einer variablen festgehalten, dann wird geprüft, ob der letzte titel ungleich dem aktuellen ist, wenn dem so ist, muß der titel neu hingeschrieben werden, und es gibt einen "neuen" altentitel. Wenn nicht, wird nur der Inhalt, nicht der Titel hingeschrieben.
Hoffe, der code ist so richtig und auch verständlich.
CU,Carsten
Nachtrag:
Wichtig ist bei der Art der Darstellung, daß du deine query nach titel sortierst, sonst klappt das ganze nicht :-((
...order by title;
Gruss, Carsten
Danke Leute!
ich werds probieren und mich nochmal melden, falls es probleme gibt ;)
MfG
Flo
Wenn ich dich richtig verstanden habe, ist dein Problem,
daß du bei mehreren gleichen Titeln den Titel einmal hinschreiben willst und dann alle dazugehörigen ds?
Bsp:
Titel 1
MeldungzuTitel1
MeldungzuTitel1
MeldungzuTitel1
Titel 2
MeldungzuTitel2
MeldungzuTitel2usw.
Du kannst ruhig ein Feld nehmen, welches jeweils den Titel beinhaltet..
Soweit klar,
aber wenn ich nur ein Feld nehme, um die Titel zu speichern, dann kann ich die ja nich richtig auslesen dann stehen da alle Titel hintereinander, in der Form
Titel1Titel2Titel3
(gleiches gilt dann ja auch für die Antworten wenn ich die alle auch in einem Feld speichere)
wie soll ich die denn dann korrekt auslesen und den jeweiligen Texten bzw Meldungen zuweisen??
danke im vorraus
MfG
Flo
Hi,
aber wenn ich nur ein Feld nehme, um die Titel zu speichern, dann kann ich die ja nich richtig auslesen dann stehen da alle Titel hintereinander, in der Form
Titel1Titel2Titel3
(gleiches gilt dann ja auch für die Antworten wenn ich die alle auch in einem Feld speichere)
wie soll ich die denn dann korrekt auslesen und den jeweiligen Texten bzw Meldungen zuweisen??
die Struktur Deiner Daten hängt ganz wesentlich davon ab, was Du damit später tun willst.
Ich glaube Deinen Angaben entnehmen zu können, daß Du einen Baum mit variabler Verzweigungsbreite traversieren können willst.
In einer relationalen Datenbank würde ich einen solchen Baum in einer einzigen Tabelle folgendermaßen darstellen:
knotennummer number;
erster_sohn number;
naechste_bruder number;
...
(weitere Komponenten, um den eigentlichen Inhalt des Knotens darzustellen)
Gibt es einen Sohn bzw. Bruder nicht, dann schreibe eine entsprechende Markierung hinein.
Eine erste Antwort zu einem Knoten hängst Du also an den first_son, falls der noch frei ist, ansonsten positionierst Du auf ihn und suchst solange die Brüder ab, bis einer davon der letzte ist, und hängst die Antwort dort dran.
Analog kannst Du die gesamte Baumstruktur später wieder lesen.
Anschauungsbeispiel (als Forum-Baum und als Tabellenwerte):
Posting 1
Posting 3
Posting 6
Posting 2
Posting 4
Posting 5
ergibt:
(1,3,2)
(2,4,0)
(3,6,0)
(4,0,5)
(5,0,0)
(6,0,0)
Wenn Du in einem solchen Baum auch noch löschen können willst, sollte ein Knoten auch einen Rückverweis auf seinen Vater bzw. vorherigen Bruder erhalten.
mfG - Michael
Hi,
ist event. ein bisschen zu spät, aber ich Antworte trotzdem mal.
Grundsätzlich ist für Deine Anforderung die Aufteilung der Tabellen notwendig, da Du in einer Tabelle ja nicht willenlos viele Felder einfügen kannst. Dadurch würde die logische Struktur durcheinander gebracht werden.
Da ich leider nicht soviel Erfahr. mit MySQl (Arbeite selbst mit Access und Paradox) habe, kann ich Dir leider nur einen Ansatz bieten.
Angenommen Du hast Produkte mit beliebig vielen Eigenschaften, dann gehst du ungefähr so vor
Produkte:
Art.-Nr. Bezeichnung Preis
---------------------------------------
012365 (key) Artikel 1 12,00
235866 (key) Artikel 2 20,00
Eigenschaften:
Id (key) Art.-Nr. Eigenschaft
-------------------------------------------
AutoWert 012365 Groß
AutoWert 012365 Schwer
In Tabelle 1 ist das Schlüsselfeld die Artikel Nr. (darf nur einmal vorkommen), dies ist das Feld das Du mit dem [Art. Nr.] Feld in der Eigenschaften Tabelle verknüpfst (hier müssen Mehrfacheinträge möglich sein). Jetzt solltest Du ind Lage sein einem Produkt mehrere Eigenschaften zuzuweisen.
Wie Du das in MySQL realisierst, kann ich Dir wie vorhergehend schon erwähnt leider nicht sagen. Ich hoffe trotzdem, das ich Dir ein wenig weiterhelfen konnte. Für weitere Informationen empfehle ich Dir auf den HP's diverser UNI's nachzuschauen, da gibte es Teilweise sehr gute Referate (gerade auch zu den Normalformen, die auf jeden Fall beachten solltest).
Gruß Stephan
Hallo
an sich brauchst du in der DB nur eine einzelne tabelle :
ID (primaryKey) Parent Titel MessageBody
---------------------------------------------------
nummer(NOT NULL) nummer Text Text
Das wichtige dabei ist "Parent".
Wenn Parent NULL ist, heisst das, das der Datensatz den Titel darstellt
z.b. ID=1
Parent=NULL
Titel=Titel1
MessageBody=Hallo
Wenn du jetzt eine Antwort zum diesem Datensatz einfügen willst, brauchst du nur einen neuen Datensatz einzufügen, dessen PARENT du auf 1 setzts ....
Natürlich muss dieser Datensatz auch eine eigenen eindeutigen ID bekommen.
hoffe, du hast es verstanden, wenn nicht, schreib mir eine E-Mail
dein SQL Create sollte so sein:
create Table Posting(ID number Primary key,
Parent number,
Titel varchar(100),
Messagebody varchar(100),
constraint fk foreign key(Parent) references Posting(ID))
Grüsse
Miraldo