2009-08-13 8 views
6

Ich habe derzeit eine Datenbank mit zwei Tabellen namens Artikel und Tags. Um Artikel in mehreren Kategorien zuzulassen, habe ich eine Beziehung zwischen vielen und vielen. Ist es ein Fehler, ein solches Design in Bezug auf die Leistung zu haben? oder sollte ich die Beziehung zwischen diesen beiden Tabellen entfernen und eine dritte Tabelle als Brücke hinzufügen (articlesTags)?Viele-zu-viele-Beziehung im Datenbankdesign

+8

Wie haben Sie eine Viele-zu-Viele-Beziehung ohne die Verwendung einer articlesTags-Tabelle erstellt? – flayto

+2

Wenn Sie eine Viele-zu-Viele-Beziehung haben, brauchen Sie die dritte Tabelle - es gibt keine vernünftige Alternative. Ihr nächster Ansatz könnte eine SET-Struktur in jeder Tabelle sein - wenn Ihr DBMS dies unterstützt. Aber es gibt normalerweise nicht viel Vergleich zwischen diesen Typen - die separate Tabelle ist notwendig. –

Antwort

15

Es gibt nichts inhärent falsch mit einer Viele-zu-viele-Beziehung, Sie müssen nur eine Junction Table erstellen (was es klingt wie Sie mit articlesTags beziehen), um diese Beziehung zu erleichtern.

+3

Auch als Intersection-Tabelle bekannt. – APC

+0

Ich möchte dafür eine sinnvolle Abstraktion. Dieser selbst erstellte und selbstverwaltete Junction Table Malarkey ist viel zu lange gegangen. – Brandon

+0

@APC oder eine Join-Tabelle (zumindest in JPA) –

1

Es gibt kein Problem mit einer Viele-zu-Viele-Beziehung, wenn dies die Daten erfordern, aber Sie möchten eine 3. Tabelle, um sie darzustellen.

+2

Ich würde sagen "Sie werden eine dritte Tabelle benötigen." – Dave

2

Es gibt kein Problem, das viele bei der Verwendung zu vielen Beziehungen. Es ist oft erforderlich.

Und ja, es ist nicht möglich, eine viele zu viele Relation zu erstellen, ohne eine dritte Tabelle zu verwenden.

6

Sie sehen den Unterschied zwischen einem konzeptionellen Datenbankentwurf (die N: N-Beziehung) und seiner physischen Realisierung. Unabhängig davon, wie Sie Ihre N: N-Beziehung modellieren, benötigen Sie die oben genannte Junction-Tabelle, damit sie funktioniert.

Es ist nichts falsch daran, eine reale Beziehung so realitätsnah wie möglich zu modellieren. Klarheit ist König.

Wenn es zu irgendeiner Leistungsfrage in irgendeinem System kommt, läuft die Antwort normalerweise auf "es hängt ab".

Wenn Ihr Leistungsproblem mit WRITES zusammenhängt, ist eine sehr NORMALISIERTE Struktur am besten, und Sie werden diese Junction-Tabelle benötigen. Sie werden am Ende viel weniger Daten schreiben und das kann die Dinge wesentlich beschleunigen (obwohl Sie diesen Vorteil verbrennen können, indem Sie nachschlagen müssen, bevor Sie die Beilagen erstellen). Das Lesen von den einzelnen normalisierten Tabellen kann auch sehr schnell sein.

Wenn Ihr Problem mit analytischen READS verbunden ist, dann ist eine DENORMALISED Struktur am besten. Joins können sehr leistungsintensiv sein, wenn die Tabellen groß sind und die Indizes sich ausbreiten. Sie werden viel Platz opfern, um viel Zeit zu gewinnen.

Im Allgemeinen möchten Sie die Besonderheiten Ihrer Situation betrachten und die Vor- und Nachteile jedes Ansatzes abwägen, bevor Sie sich für eine Lösung entscheiden. Persönlich habe ich es immer besser gefunden, mich in den Anfangsphasen auf Clarity zu konzentrieren und die Performance zu verbessern, wenn ich später ein Problem entdecke.

Verwandte Themen