2017-05-26 5 views
-1

Nehmen wir an, ich habe eine sehr große Datenbank mit Tonnen von Tabellen darin. Einige dieser Tabellen enthalten Datensätze miteinanderMySQL Datenbank Normalisierung .. eine Tabelle, um mehrere andere zu verbinden?

wie verbunden werden
table: album 
table: artist 
--> connected by table: album_artist 

table: company 
table: product 
--> connected by table: company_product 

Die Tabellen album_artist und company_product enthalten 3 Spalten repräsentieren Primärschlüssel, ALBUMID/artistID mittlerweile CompanyID/ProduktID ...

Ist es ein gute Praxis so etwas wie eine „assoc“ Tabelle zu tun, die wie

aufgebaut sind
--------------------------------------------------------- 
| id int(11) primary | leftID | assocType  | rightID | 
|---------------------------------------------------------| 
| 1     | 10  | company:product | 4  | 
| 2     | 6  | company:product | 5  | 
| 3     | 4  | album:artist | 10  | 
--------------------------------------------------------- 

ich bin nicht sicher, ob dies der Weg zu gehen, oder wenn es etwas anderes als multipl Schaffung Die Verbindungstabellen ?!

+1

_und ein Ring zu Regel dann All_ – RiggsFolly

+2

Das klingt wie eine sehr sehr schlechte Idee für mich. Was ist das Problem beim Erstellen bestimmter Verbindungstabellen? – Uueerdo

+0

Sie sagen "wenn das der richtige Weg ist", aber es gibt kein "dies" außer "so etwas [Beispiel]. Sie haben nicht erklärt, was" das "ist, oder was Ihr Beispiel ist ein Beispiel * von * Bitte erläutern Sie so viel wie möglich über das, was Sie zu tun versuchen und warum Sie denken, dass Sie es tun sollten.Sie machen auch nicht klar, was Sie unter "Erstellen mehrerer Verbindungstabellen" verstehen - meinen Sie, Tabellen wie "album_artist und company_product" zu erstellen? (Obwohl du wiederum nicht klar erklärst, was das ist.) Bitte * erkläre *, benutze nicht nur ein paar Worte, die dich daran erinnern, was du meinst, aber nicht sagst. – philipxy

Antwort

1

Nein, nein, tausend mal nein. Überlegen Sie Ihre Viele-zu-Viele-Beziehungen nicht. Behalte sie einfach. Es gibt nichts zu gewinnen und eine Menge zu verlieren, wenn Sie versuchen, alle Ihre Beziehungen in einer einzigen Tabelle zu konsolidieren.

Wenn Sie eine viele zu viele Beziehung zwischen haben, sagen guiarist und drummer, dann brauchen Sie eine guitarist_drummer Tabelle mit zwei Spalten in es: guitarist_id und drummer_id. Der Primärschlüssel dieser Tabelle sollte aus beiden Spalten bestehen. Und Sie sollten einen anderen Index haben, der aus den zwei Spalten in umgekehrter Reihenfolge besteht. Fügen Sie diesen Join-Tabellen keine dritte Spalte mit einer autoinkrementierenden ID hinzu. Das ist eine Verschwendung und erlaubt doppelte Paare in diesen Tabellen, was im Allgemeinen verwirrend ist.

Menschen, die die RDBMS-Klasse in der Schule besucht haben, werden sofort erkennen, wie diese Tabellen funktionieren. Das ist gut, denn das bedeutet, dass Sie für den Rest Ihres Lebens nicht der einzige Programmierer dieses Projekts sein müssen.

Profi-Tipp: Verwenden Sie überall den gleichen Spaltennamen. Stellen Sie in Ihrer guitarist Tabelle einen Primärschlüssel mit der Bezeichnung guitarist_id statt id ein. Es macht Ihre Beziehungstabellen leichter verständlich. Und wenn Sie ein Reverse-Engineering-Tool wie Sql Developer verwenden, wird dieses Tool einfacher mit Ihrem Schema arbeiten.

4

Nein, es ist keine gute Übung. Es ist eine schreckliche Übung, weil die referentielle Integrität aus dem Fenster verschwindet. Die referenzielle Integrität ist die vom RDBMS bereitgestellte Garantie, dass sich ein Fremdschlüssel in einer Zeile auf eine gültige Zeile in einer anderen Tabelle bezieht. Damit die Datenbank die referenzielle Integrität erzwingen kann, muss sich jede verweisende Spalte auf eine einzige referenzierte Spalte einer und nur einer referenzierten Tabelle beziehen.

+0

@philipxy Ich fürchte, ich verstehe nicht, was Sie sagen wollen. Kannst du irgendwelche anderen Orte nennen? Wie hätten Sie den Satz eher formuliert? –

+1

Ich stimme zu, dass für eine gegebene FK, "jede Verweisspalte auf eine und nur eine referenzierte Spalte von einer und nur einer referenzierten Tabelle verweisen muss". Ich verwechselte es damit, wenn einige FK (s) für referenzierende Spalten deklariert werden sollten. – philipxy

0

Die Antwort ist, dass es "hängt" von der Situation ab. In deinem Fall und den meisten anderen, nein, macht es keinen Sinn. Es macht Sinn, wenn Sie eine viele < -> viele Beziehung machen, können die Einschränkungen durch die Verknüpfungstabelle mit Fremdschlüsseln und einer eindeutigen Einschränkung erzwungen werden. Der wahrscheinlich beste Anwendungsfall wäre, wenn Sie zahlreiche Tabellen auf eine einzelne Tabelle hätten. Jede Tabelle könnte eine Verknüpfungstabelle mit Indizes enthalten. Dies wäre vorteilhaft, wenn eine der Tabellen eine große Tabelle ist und Sie die verknüpften Datensätze separat abrufen müssen.

Verwandte Themen