Ich entwerfe eine Datenbank für eine Immobilienanwendung. Es erweist sich als mehr beteiligt als ich erwartet hatte (vielleicht bin ich zu kompliziert Dinge).
Die Probleme sind im Wesentlichen auf das Vorhandensein von:
zurückzuführenIch bin mit einem eher (unbeabsichtigt) aufwendigen Klassifikationsbaum für verschiedene Immobilienarten gelandet. Die Baumknoten sind die tatsächlichen Instanzen von Eigenschaftstypen.
Ich möchte eine Datenbank erstellen, so dass ich nicht nur die Synonyme, sondern auch die Attribute abfragen kann.
So zum Beispiel die Abfrage (in Pseudo-SQL):
SELECT * aus Eigenschaften, in denen synonym="flach" und Attribut IN ("Erdgeschoss", "Garten");
sollte eine Liste von Wohnungen | Wohnungen, die entweder im Erdgeschoss sind und einen Garten haben.
zurückgebenKann mir jemand bei der Gestaltung des Datenbankschemas helfen, um die oben beschriebene Abfrage zu ermöglichen?
Last but not least, werde ich entweder MySQl oder PostgreSQL als Backend-Datenbank verwenden, würde aber bevorzugen, dass der Ansatz db-agnostisch ist - wenn möglich.
Ich würde einen anderen Ansatz für Ihr Zuordnungsschema wählen. Anstatt verschiedene Zuordnungen als Synonyme zu behandeln, würde ich sie als überlappende oder genauer verschachtelte Beschreibungen einer Eigenschaft behandeln. Dies würde Ihren Geschäftsfall behandeln und gleichzeitig die scharfsinnige Beobachtung von Mike Sherrill bestätigen.
Hier ist eine schnelle ERD-Skizze:
Durch ein sehr schnelles Datenwörterbuch:
PROPERTY
ist ein Stück Immobilien.
CATEGORY
ist eine Sammlung beschreibender Attribute. Der Punkt dieser Tabelle ist mehr als ein Organisator von Attributen als alles andere. Es könnte Dinge wie "Art der Immobilie", "Eigentümerstruktur", "Anzahl der Badezimmer" und was sonst noch interessant ist, beinhalten.
ATTRIBUTE
ist eine bestimmte Qualität von Interesse. Notieren Sie die eingerollte Beziehung für diesen Entitätstyp. Ich werde später mehr damit zu tun haben. Der Hauptpunkt ist, dass Attribute allgemeiner oder spezifischer sein können und einige Attribute als Verfeinerungen anderer Attribute angesehen werden können.
DESCRIPTOR
ist die Schnittmenge einer EIGENSCHAFT und der ATTRIBUTE, die dieser bestimmten Immobilie zugeordnet wurden.
Wie soll das helfen?
Der Schlüssel ist, wie Attribute funktionieren. Wenn Sie ein geschachteltes Mengenmodell verwenden, können Sie mehr oder weniger spezifische Kriterien für die Zuordnung und Suche anwenden. Betrachten Sie das folgende Diagramm einer potenziellen KATEGORIE mit den zugehörigen ATTRIBUTEN:
In diesem Beispiel ist die KATEGORIE "Art der Eigenschaft". Aus dem Diagramm ist ersichtlich, dass die Attribute in dieser Kategorie hierarchisch aufgeteilt sind. Jedes Feld im Diagramm ist ein Datensatz in ATTRIBUTE. Felder, die andere Felder enthalten, haben untergeordnete Attribute. Boxen, die sich in einer anderen Box befinden, haben eine FK in ihrer Box und so weiter.
Auf diese Weise könnten Sie sagen: "Ich möchte eine Immobilie finden, die ein Penthouse ist". Sie können dann PROPERTY-Datensätze mit einem zugehörigen DESCRIPTOR finden, der auf das ATTRIBUTE "Penthouse" zeigt. Das ist ziemlich einfach. Aber was, wenn deine Suche leer ist?
Der Vorteil dieses Ansatzes ist, dass Sie dann Ihre Kriterien lockern können, indem Sie sagen: "Lassen Sie uns die Attributionshierarchie auf die nächste weniger spezifische Sache als Penthouse gehen". In meinem Beispiel wäre das "Hochhaus". Jetzt versuchen Sie erneut Ihre Suche und Sie haben vielleicht mehr Glück.
Ein System wie dieses gibt Ihnen die Möglichkeit, in jeder Attributionskategorie so spezifisch zu sein wie Sie wollen, während Sie die anderen weit genug entspannen, um Suchtreffer zu erhalten. Das ist wirklich, worum es bei einem Immobilienmakler geht, oder? Dem Kunden helfen, die notwendigen Kompromisse einzugehen, um die beste Lösung für seine wichtigsten Kriterien zu finden?
Umgang mit verschachtelten Sets
Der einzige knifflige Teil dieses Ansatzes ist die Handhabung der verschachtelten Mengen. Es gibt viele Möglichkeiten, dies zu tun, von denen viele an anderer Stelle gründlich dokumentiert wurden. Ich selbst mag die Methode visitation number , insbesondere für relativ statische Datensätze. Dies macht es sehr einfach, Übereinstimmungen für ein bestimmtes ATTRIBUTE oder eines seiner untergeordneten Elemente zu finden, ohne in Ihrem SQL etwas Exotisches tun zu müssen.
BEARBEITEN: Wie funktioniert das?
OP hat gefragt, wie Sie mit Dingen wie der Anzahl der Schlafzimmer umgehen und wie sehen die Anfragen aus? Nehmen wir ein anderes Beispiel zur Veranschaulichung:
Oben sehen Sie die verschachtelten Sätze für die KATEGORIE "Anzahl der Schlafzimmer". Ich habe auch die Visitationsnummern zum Diagramm hinzugefügt. Beachten Sie die Funktionsweise der Besucherzahlen. Beachten Sie insbesondere, dass die linken (grünen) und rechten (roten) Zahlen für einen beliebigen Attributwert die linken und rechten Besucherzahlen für untergeordnete Attribute enthalten. Zum Beispiel hat "2 + Schlafzimmer" links und rechts die Nummern 6 und 15. Jedes Attribut, das unter "2 + Schlafzimmer" fällt, hat linke und rechte Zahlen, die in diesen Bereich fallen.
Wie würden Sie also nach Eigenschaften mit einem bestimmten Deskriptor suchen? Nehmen wir an, wir möchten alle Eigenschaften mit zwei oder mehr Schlafzimmern finden. Die SQL für eine solche Abfrage könnte etwa so aussehen:
%Vor%Beachten Sie, dass die obige Abfrage ein wenig anders ist als das, was Sie tatsächlich verwenden könnten. Beispielsweise würden Sie wahrscheinlich das Filterattribut mit seinem int-Identitätsschlüssel anstelle seines Zeichenfolgennamens suchen. Allerdings dachte ich, ich würde es wie gezeigt für Klarheit um den Hauptpunkt verlassen, den Sie filtern, indem Sie nicht für ein bestimmtes verwandtes Attribut suchen, sondern für alle verwandten Attribute, die in Ihren Filter Bereich .
Wenn Sie nach mehreren Attributen filtern möchten, fügen Sie Ihrer where-Klausel einfach weitere Untersätze hinzu.
Um mit Synonymen umzugehen, können Sie viele-zu-viele zwischen einer Tabelle suchen, die die statische Liste Ihrer Eigenschaftstypen enthält, und einer Tabelle, die das Synonym enthält. Auf diese Weise könnte ein Synonym mehreren Eigenschaftstypen zugeordnet werden.
Zum Beispiel:
%Vor%Für Eigenschaften könnten Sie eine Art offene Attributstruktur verwenden.
Zum Beispiel:
%Vor%Hoffe, das hilft
Tags und Links database-design