2016-05-25 6 views
2

Ich frage mich, was ist die beste Lösung, um Beziehungen zwischen 2 Tabellen in MySQL zu speichern.Speichern von Zuweisungen zwischen 2 Tabellen in MySQL

Ich habe folgende Struktur

Table: categories 

id | name   | etc... 
_______________________________ 
1 | Graphic cards | ... 
2 | Processors  | ... 
3 | Hard Drives | ... 

Table: properties_of_categories 

id | name  
_____________________ 
1 | Capacity 
2 | GPU Speed 
3 | Memory size 
4 | Clock rate 
5 | Cache 

Jetzt muss ich sie Verbindungen haben, und Frage ist, was eine bessere ist, effizientere und leichtere Lösung, was wichtig ist, weil es hunderte von Kategorien und Tausenden sein, Eigenschaften, die ihnen zugewiesen sind.

Sollte ich nur einen anderen Tisch mit einer Struktur wie

categoryId | propertyId 

Oder vielleicht eine andere Spalte zu den Kategorien Tabelle und Speichereigenschaften in Textfeld hinzufügen, wie 1,7,19,23

Oder vielleicht schaffen json Dateien zum Beispiel 7.json mit Inhalt benannt wie

{1,7,19,23} 

Antwort

1

Die erste Lösung ist besser, wenn es um relationale Datenbanken geht. Sie sollten eine Tabelle erstellen, die jede Kategorie, um mehrere Eigenschaften paaren wird (1: n-Beziehung)

Sie die Tabelle wie so strukturieren können:

CREATE TABLE categories_properties_match(
    categoryId INTEGER NOT NULL, 
    propertyId INTEGER NOT NULL, 
    PRIMARY KEY(categoryId, propertyId), 
    FOREIGN KEY(categoryId) REFERENCES categories(id) ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY(propertyId) REFERENCES properties_of_categories(id) ON UPDATE CASCADE ON DELETE CASCADE 
); 

Der Primärschlüssel wird sichergestellt, dass es keine doppelten Einträge sein, das bedeutet Einträge, die einer Kategorie zweimal der gleichen Eigenschaft entsprechen

+1

Wow, ich habe gerade etwas Neues gelernt. Ich wusste nichts über CASCADE. Vielen Dank für Ihre Hilfe. Ich werde Ihre Lösung verwenden. –

2

Da diese Frage zu Relational Welt betreffen wird, würde ich vorschlagen, eine andere Tabelle hinzuzufügen Mann zu speichern y zu viele Beziehung zwischen Kategorie und Eigenschaft.

Sie können die JSON-Spalte auch verwenden, um viele Werte in einer Tabelle zu speichern.

JSON-Datentyp wird in MYSQL 5.7 eingeführt und es wird mit verschiedenen Funktionen für JSON-Datenabruf und -aktualisierung geliefert. Wenn Sie jedoch eine ältere Version verwenden, müssen Sie sie mit einer String-Spalte mit einigen umständlichen Abfragen für die String-Manipulation verwalten.

2

Die erforderliche Struktur hängt vom Beziehungstyp ab: Eins-zu-Viele, Viele-zu-Eins oder Viele-zu-Viele (M2M).

Bei einem Eins-zu-Viele-System bezieht ein Fremdschlüssel (FK) auf der "Viele" -Seite viele Elemente auf die "Eins" -Seite. Das Gegenteil ist für viele Eins zu eins.

Für Viele-zu-Viele (M2M) benötigen Sie eine intermediäre relationale (oder Junction-) Tabelle, genau wie Sie es vorschlagen. Dadurch können Sie sowohl Kategorien als auch Eigenschaften in beliebigen Kombinationen wiederverwenden. Allerdings ist es etwas mehr SQL - erfordert 2 JOINs.

Wenn Sie nach Leistung suchen, dann wäre die Verwendung von FKs zu Primärschlüsseln (PKs) sehr effizient und die Abfragen sind ziemlich einfach. Die Verwendung von JSON würde vermutlich erfordern, dass Sie PHP analysieren und fliegende zweite Abfragen erstellen, die Ihre Codierungsarbeit und das Testen, die Datenübertragung, den CPU-Overhead und die Skalierbarkeit der Grenzen vervielfachen würden.

In Ihrem Fall rate ich, dass sowohl "Grafikkarten" und "Festplatten" z. "Speichergröße" plus andere Eigenschaften, so würden Sie eine M2M relationale Tabelle benötigen, wie Sie vorschlagen.

Solange Ihre Schlüssel indiziert sind (welche PKs sind), wird Ihr JOIN zu dieser relationalen Tabelle sehr schnell und effizient sein.

Wenn Sie CONSTRAINTs mit Ihren Beziehungen verwenden, stellen Sie sicher, dass Sie die Datenintegrität beibehalten: Sie können keine Kategorie löschen, an die eine Eigenschaft angehängt ist. Dies ist auf lange Sicht eine gute Eigenschaft.

Hunderte und Tausende von Datensätzen ist eine winzige Menge für MySQL. Sie würden diese Technik sogar mit Millionen von Datensätzen verwenden. Es gibt also keine Sorgen über die Größe.

RDBMS-Datenbanken wurden speziell dafür entwickelt. Daher würde ich empfehlen, die nativen Funktionen zu verwenden, anstatt es in JSON selbst zu tun. (es sei denn, ich vermisse etwas neues JSON MySQL-Feature! *)

* Seit dieser Veröffentlichung stolperte ich tatsächlich über a new JSON MySQL feature. Es scheint, als könnten Sie nach einer kurzen Lektüre alle möglichen neuen Strukturen und Relationen mit JSON und virtuellen Spaltenschlüsseln implementieren, wodurch möglicherweise Junction-Tabellen überflüssig werden. Dies wird wahrscheinlich die Grenze zwischen MySQL als RDBMS und NoSQL verwischen.

+0

Wow, das war eine umfassende Antwort. Vielen Dank. –

+0

Gern geschehen. Die Antwort von dimlucas ist richtig, ich habe dir nur mehr "warum" gesagt, es ist die richtige Wahl. Ich wäre vorsichtig mit kaskadierenden Löschungen! Sie funktionieren, aber Sie benötigen in der Regel Anwendungslogik, um sicherzustellen, dass die Löschung wie gewünscht ist. – scipilot