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!
Gestartet eine Prämie. Hoffe auf mehr Antworten von all den DB-Gurus da draußen. – RabidFire
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. –
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