2011-01-04 1 views
6

Betrachten Sie eine E-Commerce-Anwendung mit mehreren Speichern. Jeder Ladenbesitzer kann den Artikelkatalog seines Geschäfts bearbeiten.Die beste Methode, um von Benutzern eingereichte Elementnamen (und deren Synonyme) zu speichern

Mein aktuelles Datenbankschema ist wie folgt:

item_names: id | name | description | picture | common(BOOL) 
items: id | item_name_id | picture | price | description | picture 
item_synonyms: id | item_name_id | name | error(BOOL) 

Hinweise: error deutet auf eine falsche Schreibweise (zB "Ericson".). description und picture der item_names Tabelle sind „Globals“, die von „local“description und picture Feldern der items Tabelle (im Fall des Ladenbesitzer ein anderes Bild für einen Artikel liefern will) gegebenenfalls außer Kraft gesetzt werden kann. common hilft separaten einzigartigen Itemnamen ("Jimmy Joe Cheese Pizza" von "Käse-Pizza")

ich die helle Seite dieses Schema denken ist:

Optimierte & Synonyme Handhabung Suche: ich die item_names abfragen & item_synonyms Tabellen mit name LIKE %QUERY% und erhalten Sie die Liste der item_name_id s, die mit der Tabelle items verbunden werden müssen. (Beispiele für Synonyme: "Sony Ericsson", "Sony Ericson", "x10", "x 10")

Auto-Vervollständigung: Wiederum eine einfache Abfrage an die item_names Tabelle. Ich kann die Verwendung von DISTINCT vermeiden und minimiert Anzahl von Variationen ("Sony Ericsson Xperia ™ X10", "Sony Ericsson - Xperia X10", "Xperia X10 von Sony Ericsson")

Die Kehrseite wäre:

Overhead: wenn ein Element eingesetzt wird, abfragen ich item_names wenn dieser Name bereits zu sehen, existiert. Wenn nicht, erstelle ich einen neuen Eintrag. Wenn ein Element löscht, zähle ich die Anzahl der Einträge mit dem gleichen Namen. Wenn dies der einzige Eintrag mit diesem Namen ist, lösche ich den Eintrag aus der item_names Tabelle (nur um die Dinge sauber zu halten; Konten für mögliche fehlerhafte Eingaben). Und Aktualisierung ist die Kombination von beidem.

Weird Artikel-Namen: Ladenbesitzer verwenden manchmal Sätze wie "Harry Potter 1, 2 Bücher + CDs + Magic Hat". Es liegt etwas daran, so viel Overhead zu haben, um Fälle wie diese unterzubringen. Dies wäre vielleicht der Hauptgrund sein Ich bin für ein Schema wie folgt zu gehen versucht:

items: id | name | picture | price | description | picture 

(... mit item_names und item_synonyms als Utility-Tabellen, die ich nicht abfragen)

  • Gibt es ein besseres Schema, das Sie vorschlagen würden?
  • Sollen Elementnamen für Autocomplete normalisiert werden? Ist das wahrscheinlich Facebook für "Schule", "Stadt" Einträge?
  • Ist das erste Schema oder das zweite besser/optimal für die Suche?

Vielen Dank im Voraus!

Referenzen: (1) Is normalizing a person's name going too far?, (2) Avoiding DISTINCT


EDIT: Bei 2 Artikel mit ähnlichen Namen eingegeben werden, der ein Admin diese einfach sieht klickt "Make Synonym", die wandelt einen der Namen in das Synonym des anderen um. Ich benötige keine Möglichkeit, automatisch zu erkennen, ob ein eingegebener Name das Synonym des anderen ist. Ich hoffe, dass die Autovervollständigung 95% solcher Fälle behandeln wird. Wenn das Tabellen-Set größer wird, wird die Notwendigkeit, "Synonym zu machen", geringer. Hoffnung, die die Verwirrung löscht.


UPDATE: diejenigen, wer möchte wissen, was ich ging weiter mit ... Ich habe mit dem zweiten Schema gegangen, aber entfernt die item_names und item_synonyms Tabellen in der Hoffnung, dass Solr mich bieten wird mit der Fähigkeit, alle verbleibenden Aufgaben, die ich brauche, zu erfüllen:

items: id | name | picture | price | description | picture 

Vielen Dank für die Hilfe!

+0

Gestartet eine Prämie. Hoffe auf mehr Antworten von all den DB-Gurus da draußen. – RabidFire

+1

Ich denke, das Problem ist, dass wir Ihre Anforderungen nicht klar sind. Ich werde vorschlagen, was ich denke, geschieht. Du bist gleichbedeutend mit Amazon. Mehr als ein Verkäufer könnte {Nike Air Jordon Red/White 10.5US} anbieten. Aber sie können sie alle mit unterschiedlichen Namen benennen, so dass Sie ein Normalisierungsproblem haben. Dies sind keine Artikel mit SKU, die eine universelle PK haben. Du versuchst also abzuleiten, dass zwei Dinge durch einen Vergleich der Charaktere im Namen wirklich identisch sind? Und Sie denken, dass dies ein Problem des richtigen Schemas ist? Ich verstehe es nicht. –

+0

Meine Anforderungen wären "Optimierte Suche", "Umgang mit Synonyme" und "Autocomplete". Ein Benutzer versucht, ein Element aus einem Textfeld einzugeben. Die automatische Vervollständigung versucht, zu viele Variationen desselben Objektnamens zu verhindern. Ja, es ist ein Designproblem. Ich suche nach einer besseren Perspektive bei der Auswahl des zweiten Schemas gegenüber dem ersten. – RabidFire

Antwort

2

Die Anforderungen, die Sie in Ihrem Kommentar angeben ("Optimierte Suche", "Umgang mit Synonymen" und "Autocomplete") sind keine Dinge, die normalerweise mit einem RDBMS verbunden sind. Es hört sich so an, als ob das, was Sie zu lösen versuchen, ein Suchproblem ist, kein Datenspeicherungs- und Normalisierungsproblem.Sie könnten wie Solr

aus der solr Feature-Liste Excerptiert bei einigen Sucharchitekturen starten möchten suchen:

facettierte basierte Suche auf eindeutige Feldwerte, explizite Abfragen oder Datumsbereiche

Rechtschreibung Vorschläge für Benutzer abfragt

Weitere ähnliche Themen Vorschläge für bestimmtes Dokument

automatischen Vorschlags Funktionalität

Performance-Optimierungen

+0

Schön! Ich habe mir Solr und seine Eigenschaften angeschaut. Es scheint extrem mächtig zu sein (besonders seine Textanalyse) und beschreibt genau das, wonach ich suche. Vielen Dank. Bounty ausgezeichnet – RabidFire

0

Nur eine Idee.

Eine Sache, die mir in den Sinn kommt, ist das Sortieren der Zeichen im Namen und im Synonym, die den ganzen weißen Raum wegwerfen. Dies ist ähnlich der Lösung, alle Anagramme für ein Wort zu finden. Das Endergebnis ist die Fähigkeit, ähnliche Einträge schnell zu finden. Wie Sie darauf hingewiesen haben, sollten alle Synonyme zu einem einzigen Begriff oder Namen zusammenlaufen. Die Suche erfolgt anhand von Synonymen unter Verwendung einer neu sortierten Eingabezeichenfolge.

+0

Das ist eine nette Möglichkeit, Anagramme zu speichern, in denen Wörter * auch * zueinander stehen, wenn die sortierten Zeichen mit Leerraum identisch sind. Aber ich glaube nicht, dass ich "Tops" zurückgeben möchte, wenn ein Nutzer nach "Pötten" sucht. :) – RabidFire

1

Wenn mehr Attribute für die Zuordnung verfügbar wären, würde ich vorschlagen, ein schnelles Suchindexsystem zu verwenden. Keine Notwendigkeit, Aliase einzurichten, wenn die Datensätze hinzugefügt werden, die Attribute werden einfach indiziert und jede Suche gibt Treffer mit einem Relevanzwert zurück. Nimm die oberen X% als gültige Übereinstimmungen und zeige diese an.

Das Erstellen und Speichern von Aliasen scheint ein brute-force, arbeitsintensiver Ansatz zu sein, der sich wahrscheinlich nicht an die Bedürfnisse Ihrer Benutzer anpassen kann.

+0

Ich gehe davon aus, dass Sie mich bitten, Speicher Synonyme (Aliase) zu entfernen? Wie würde ich Suchergebnisse für "Joghurt", "Joghurt" oder "Yoghurt" zurückgeben? http://en.wikipedia.org/wiki/Yoghurt Ich gehe davon aus, dass es am Anfang arbeitsintensiv sein wird. Aber wenn die Anzahl der Artikel steigt, werden die Menschen dank Autocomplete meist bereits vorhandene Artikel hinzufügen. Ich denke, die Facebook-Vervollständigung für den College-Namen ist ein schönes Beispiel dafür. – RabidFire

+0

Es gibt Indexsysteme, die Fuzzy-Logik verwenden, um Übereinstimmungen zu finden. Klingt ähnlich oder ähnlich wie zum Beispiel Sucharten. Keine große Antwort, stimme ich zu, da es keine spezifische Technologie bietet - ich hatte nur gehofft, Sie in eine andere Richtung zu lenken und Ihnen mehr Möglichkeiten zu geben. – ScottCher

+0

Danke für die Hilfe. Upvoted, weil es mich ein wenig mehr über das zweite Schema nachdenken ließ. Ich denke, ich werde Solr die schwere Arbeit überlassen (basierend auf der Antwort eines anderen Posters). – RabidFire

Verwandte Themen