2016-04-13 7 views
1

Ich möchte eine Website erstellen, auf der Artikel nur in bestimmten Regionen verfügbar sind. Die Regionen/Orte, an denen diese Elemente verfügbar sind durch das folgende Muster ausgewählt werden:Hierarchische Struktur mit (My) SQL-Datenbank

  1. Entweder Zustände ausgewählt sind sonst der Artikel verfügbar Nation ist breit.
  2. Für jeden ausgewählten Status können Landkreise ausgewählt werden, ansonsten ist er landesweit verfügbar.
  3. Für jede Grafschaft können Städte ausgewählt werden, ansonsten ist sie landesweit verfügbar.

Und so weiter ... Sie haben wahrscheinlich die Idee.

Nun meine Frage ist, wie würden Sie eine solche Struktur mit einer MySql DB implementieren? Oder gibt es ein noch besseres DB-Modell mit einer passenden GUI? (Das wäre perfekt) Die Anzahl der Artikel ist ziemlich klein (~ 20).

Wenn der Kunde die Seite besucht, gibt er seinen Standort ein und jeder für seinen Standort verfügbare Artikel wird aufgelistet. Wie würde eine Abfrage für diesen Zweck aussehen?

Vielen Dank im Voraus, Flo

+1

Relationale Datenbanken sind schrecklich in Hierarchien. Vielleicht ist dafür eine XML-, JSON- oder Graph-Datenbank besser geeignet. Auf der anderen Seite hat MySQL 5.7.8 den Datentyp [JSON] (https://dev.mysql.com/doc/refman/5.7/en/json.html), so dass Sie es als JSON-Datenbank verwenden können. – apokryfos

+0

Ich habe schon vermutet, dass JSON hier besser geeignet wäre, aber aus irgendeinem Grund möchte mein Klient irgendwie bei SQL bleiben. Wahrscheinlich, weil er das gewohnt ist. – flxh

+0

Oder vielleicht ist es, weil er nur ein albernes Webhosting-Paket anstelle eines vServers gekauft hat – flxh

Antwort

1

Sie eine Tabelle locations mit folgenden Spalten erstellen:

id | type | name  | parent_id 
1 | 1 | State 1  |   0 
2 | 1 | State 2  |   0 
3 | 2 | County 1 |   1 
etc 

In diesem Beispiel gehört Kreis 1 1 in dem Zustand, und "id 0" angenommen wird, "bundesweit" sein.

Mit diesem Modell ist die Erstellung von GUI zum Einstellen der Verfügbarkeit von Elementen ziemlich einfach: Sie zuerst Abfrage von parent_id = 0 und bieten es als Liste, mit zusätzlichen nationwide als Standardoption; Wenn ein Status ausgewählt ist, generieren Sie eine andere Liste mit der ausgewählten ID parent_id und geben state wide als Standardoption usw. an. Nachdem der Benutzer auf "Save" geklickt hat, wird die tiefste Ebene id abgerufen und in der Elementtabelle als location_id gespeichert.

Wenn es darum geht, die Artikelliste tatsächlich zu erhalten, wird es jedoch weniger einfach. Wenn Ihr Benutzer beispielsweise angibt, dass sein Standort County 1 lautet, sollten Sie ein kombiniertes Ergebnis für Elemente mit location_id = 3, 1 oder 0, die in der Baumstruktur von parent_id angezeigt werden, zurückgeben. Wenn Sie ein RDBMS verwenden, das rekursive Abfragen unterstützt, können Sie diese in einer einzigen Abfrage abrufen. MySQL unterstützt das nicht, daher müssen Sie es umgehen, indem Sie eine Schleife erstellen, um die Adresse items mit der spezifischen Standort-ID abzufragen, dann parent_id aus den Speicherorten auszuwählen und die Abfrage dafür zu wiederholen.

Die negative Seite ist, dass Sie die Strukturintegrität mit dieser Struktur nicht kontrollieren. Das bedeutet, dass Sie nicht kontrollieren können, dass eine Stadt nur einen Kreis als Elternteil haben kann - Sie können aber auch Insert-/Update-Trigger erstellen, um dabei zu helfen. Es ist auch möglich, eine Schleife zu erstellen (indem Elemente miteinander verknüpft werden), was möglicherweise zu Problemen führen kann.

1

Here finden Sie eine ziemlich detaillierte Erklärung der verschiedenen Ansätze für das Problem. Grundsätzlich sind Ihre Optionen a) Konstruieren Sie eine ParentID/ChildID-Struktur oder b) eine verschachtelte Menge. Da, während andere rdbms Systeme Rekursion unterstützen MySQL nicht (zumindest nicht ohne die Verwendung einer aufwendigen gespeicherten Prozedur), und vor allem, da Ihre Daten scheinen ziemlich statisch zu sein, dh wird sich nicht wirklich viel ändern; Ich schlage vor, Sie gehen den verschachtelten Weg.Es würde dir die Dinge viel leichter machen.