Kategorieneinteilung mit guter Performance

Kategorieneinteilung mit guter Performance

am 12.06.2006 09:11:33 von manne

Hallo,

ich arbeite an einem System, bei dem User Artikel schreiben und diese
in Kategorien einordnen können. Es stellt sich aber die Frage, wo die
Kategorie, die zu einem Artikel gehört, am besten abgespeichert wird:

eine Möglichkeit wäre, die Kategorie direkt in einer Tabelle mit den
Artikelinformationen abzuspeichern, eine andere Möglichkeit wäre,
eine separate Tabelle nur für Kategorien zu erstellen, in der eine
Artikel-ID als Fremdschlüssel verwendet wird.

Außerdem stellt sich noch die Frage, ob es sinnvoller ist, jeweils
über- und untergeordnete Kategorien zu einem Artikel zu speichern
(Problem: eine Kategorie kann mehrere Unterkategorien besitzen) oder
nur die übergeordneten Kategorien abzuspeichern (dann würde ich die
Unterkategorien ermitteln, indem ich eine Abfrage abschicke, die mir
alle Kategorien ausgibt, bei denen die aktuelle Kategorie als
übergeordnete Kategorie eingetragen ist).

Die Abfrage würde ziemlich häufig eingesetzt werden, weshalb sie auch
noch effizient sein sollte. Jemand eine Idee?

Gruß
manne

Re: Kategorieneinteilung mit guter Performance

am 12.06.2006 16:40:30 von Axel Schwenke

"manne" wrote:

> ich arbeite an einem System, bei dem User Artikel schreiben und diese
> in Kategorien einordnen können.

Aha. Das 1001. CMS?

> Es stellt sich aber die Frage, wo die
> Kategorie, die zu einem Artikel gehört, am besten abgespeichert wird:
>
> eine Möglichkeit wäre, die Kategorie direkt in einer Tabelle mit den
> Artikelinformationen abzuspeichern, eine andere Möglichkeit wäre,
> eine separate Tabelle nur für Kategorien zu erstellen, in der eine
> Artikel-ID als Fremdschlüssel verwendet wird.

Kommt auf die Relation an. Wenn ein Artikel zu genau einer Kategorie
gehört (1:1) dann spricht alles für ein Feld kategorie_id in der
Artikel-Tabelle. Die Kategorien selber (mit Bezeichnungen und Verwand-
schaftsverhältnissen) sollten eine eigene Tabelle bekommen.

> Außerdem stellt sich noch die Frage, ob es sinnvoller ist, jeweils
> über- und untergeordnete Kategorien zu einem Artikel zu speichern
> (Problem: eine Kategorie kann mehrere Unterkategorien besitzen) oder
> nur die übergeordneten Kategorien abzuspeichern (dann würde ich die
> Unterkategorien ermitteln, indem ich eine Abfrage abschicke, die mir
> alle Kategorien ausgibt, bei denen die aktuelle Kategorie als
> übergeordnete Kategorie eingetragen ist).

Zum Artikel gehört IMHO genau Eintrag: die Kategorie, der er zugeordnet
ist. Eine Suche "alle Artikel zu Kategorie X oder Subkategorie davon"
würde man per SELECT .. WHERE kategorie_id IN (...) lösen und ... in
einer extra Query ermitteln. Die Alternative wäre eine Tabelle
(artikel_id, kategorie_id) - aber die würde sich z.B. jedesmal ändern,
wenn sich etwas an den Kategorien ändert.


XL

Re: Kategorieneinteilung mit guter Performance

am 12.06.2006 21:04:39 von Dominik Echterbruch

manne wrote:
^^^^^
Wer?

> Außerdem stellt sich noch die Frage, ob es sinnvoller ist, jeweils
> über- und untergeordnete Kategorien zu einem Artikel zu speichern
> (Problem: eine Kategorie kann mehrere Unterkategorien besitzen) oder
> nur die übergeordneten Kategorien abzuspeichern (dann würde ich die
> Unterkategorien ermitteln, indem ich eine Abfrage abschicke, die mir
> alle Kategorien ausgibt, bei denen die aktuelle Kategorie als
> übergeordnete Kategorie eingetragen ist).

Das hört sich für mich nach einer Baumstruktur an, kann das sein?


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Kategorieneinteilung mit guter Performance

am 13.06.2006 11:09:16 von manne

Danke für eure Antworten.

@ Alex:
>Eine Suche "alle Artikel zu Kategorie X oder Subkategorie davon"
> würde man per SELECT .. WHERE kategorie_id IN (...) lösen und ... in
> einer extra Query ermitteln.

Sollte man dort dann aus Performance-Gründen vielleicht nicht besser
"WHERE kategorie_id =3D ..." verwenden, weil MySQL ansonsten keinen Index
verwendet?


@Dominik Echterbruch schrieb:

> Das hört sich für mich nach einer Baumstruktur an, kann das sein?

Jep. Habe gestern noch etwas über sog. Nested Sets
(http://www.develnet.org/36.html) gelesen. Hast du in diesem bereich
schon Erfahrungen gesammelt und weisst, ob es auch für kleinere
Systeme sinnvoll ist? Es geht mir vor allem darum, zugehörige
Kategorien möglichst schnell abfragen zu können.

Grüße
Manfred

Re: Kategorieneinteilung mit guter Performance

am 13.06.2006 13:41:52 von Axel Schwenke

"manne" wrote:
> Danke für eure Antworten.
>
> @ Alex:
>>Eine Suche "alle Artikel zu Kategorie X oder Subkategorie davon"
>> würde man per SELECT .. WHERE kategorie_id IN (...) lösen und ... in
>> einer extra Query ermitteln.
>
> Sollte man dort dann aus Performance-Gründen vielleicht nicht besser
> "WHERE kategorie_id = ..." verwenden, weil MySQL ansonsten keinen Index
> verwendet?

WHERE spalte IN (const, const, ...) verwendet einen Index.
Ganz allgemein ist das ein gut optimierter Fall. Siehe:
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators. html


XL