PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [MySQL] Frage zum Datenbankaufbau


lars0816
2010-11-05, 02:24:36
Guten Abend,

erst einmal sorry für den sehr vagen Titel, ich habe leider keine Ahnung wie ich meine Frage präzise in einen Einzeiler packen kann.

Und zwar: Für ein privates Projekt baue ich derzeit ein System, was es erlauben soll, verschiedene Artikel mit Tags zu versehen. Die Tags ihrerseits sollen bewertet werden können, und zwar für jeden Artikel gesondert. Man stelle sich also ein System wie in Youtube vor, wo ein Artikel mit bestimmten Tags versehen ist, nur dass man auch neue Tags vergeben kann und die bestehenden Tags besser oder schlechter (nur für diesen Artikel!!) bewerten kann.

Mein Gedanke ist folgender...
Ich erstelle eine "Bewertungstabelle" mit folgenden Spalten:
id - Primärschlüssel pro Artikel
Artikel-id - zur Refernzierung auf die verschiedenen Teile des Inhalts des Artikels [integer]
Tags - Ein Array mit den verschiedenen Tag-Ids [array mit integern]
Bewertungen - ein array mit Bewertungen der Tags an Stelle 0-n [array mit integern]

Parallel dazu erstelle ich eine [I]"Tag-Tabelle", die sieht wie folgt aus:
id - Die Tag-IDs der anderen Tabelle, hier als Primärschlüssel
Tag-Text - Der Inhalt eines einzelnen Tags, z.B. "london", "lady gaga" oder sowas in die richtung [string]
Es müsste also jedes mal, wenn ein User ein noch nicht vorhandenes Tag eingibt, ein neuer Tag-Eintrag gemacht werden.

Meine Frage ist jetzt, ob dieser Ansatz Sinn macht. Ich müsste nun eigentlich für einen Artikel jedes Tag einwandfrei mit einer Bewertung verknüpfen können, indem ich das Tag an der Stelle x mit der Bewertung an der Stelle x verbinde, richtig? Irgendwie schmeckt mir die Lösung nicht ganz...

Ich habe allerdings noch einen alternativen Gedanken. Hier wird eine [I]"Artikelspezifische Tag-Tabelle" angelegt, die aus folgenden Spalten besteht:

id - Die Id eines Tags als Primärschlüssel [integer]
tag - der Text des Tags [string]
artikel-id - Die Id eines Artikels [integer]
bewertung - die bewertung des tags [integer]

Die oben zuerst genannte "Bewertungstabelle" würde dann zur Artikeltabelle, in der die Spalten "Tags" und "Bewertungen" wegfallen, die Verknüpfung erfolgt dann über die Artikel-Id.

Jetzt wo ich nochmal drüber nachdenke, gefällt mir der zweite Vorschlag eigentlich besser, weil man Arrays in großen Tabellen, wenn möglich, vermeiden sollte. Der Nachteil wäre dass die "artikelspezifische Tag-Tabelle" extrem groß werden könnte.

Was meint ihr, welcher Ansatz ist euer Favorit, auch hinsichtlich potenzieller Rechenzeit? Oder habt ihr noch einen besseren Vorschlag? Input ist sehr willkommen!

danke im Voraus,
Lars

samm
2010-11-05, 02:58:23
Jap, in der Tat ist deine Lösungen zu verbessern, und zwar wie folgt:

Tag-Tabelle:
id (PK)
tag

Artikel-Tabelle:
id (PK)
[andere Attribute, z.B. der Artikel selbst^^]

Bewertungs-Tabelle:
tag_id (PK-Teil, FK auf Tag-Tabelle.id)
artikel_id (PK-Teil, FK auf Artikel-Tabelle.id)
bewertung


Dass die Bewertungstabelle halt maximal #Artikel * #Tags gross wird, ist egal, so ne Tabelle darf ruhig in die Millionen Zeilen wachsen, wird auch nicht viel Speicherplatz verbrauchen mit ganzen drei Int-Werten. Wobei ich annehme, dass du die Bewertung gewichten möchtest, dementsprechend bräuchtest du zwei Werte für Bewertung (einen noch für die Anzahl abgegebener Bewertungen).

lars0816
2010-11-05, 03:45:39
Jetzt wo ich es so sehe ist es total logisch.. manchmal sieht man echt den Wald vor lauter Bäumen nicht.. immerhin war ich recht nah dran ;)

Danke dir für deine schnelle und gute Antwort!

lg Lars

Senior Sanchez
2010-11-05, 10:05:14
Jetzt wo ich es so sehe ist es total logisch.. manchmal sieht man echt den Wald vor lauter Bäumen nicht.. immerhin war ich recht nah dran ;)

Danke dir für deine schnelle und gute Antwort!

lg Lars

An der Stelle hilft es oft sich das Schema zuerst aufzumalen und dann per Überführung in die Normalformen die endgültigen Relationen abzuleiten. Deine Array-Idee in einer Spalte würde dabei schon direkt der 1. Normalform widersprechen. ;)