sql - Gibt es ein vereinbartes ideales Schema für das Tagging?




(5)

Ich habe das in einem kleinen System ohne sehr viele Benutzer gemacht, aber ich habe mich schon einmal gefragt, ob es eine "akzeptierte" Möglichkeit gibt, Tags zu verwalten. Nach dem Lesen der Links, die von insin und vielen anderen Blogbeiträgen zum Tagging gepostet wurden, scheint es der akzeptierte Weg zu sein, es vollständig normalisiert zu speichern und bestimmte Dinge zu puffern, wenn Ihr Datensatz zu groß wird.

Da es sich um eine Viele-Viele-Beziehung handelt (jedes Tag kann zu einer beliebigen Anzahl von Fotos gehören - jedes Foto kann viele Tags haben), können Sie mit der relationalen Datenbanktheorie eine Fototabelle, eine Tag-Tabelle und eine Querverweistabelle erstellen.

photos
  photoid
  caption
  filename
  date

tags
  tagid
  tagname

phototags
  photoid
  tagid

Dies hat Skalierungsprobleme bei der Auswahl von wirklich großen Datensätzen, aber auch bei allen weniger normalisierten Schemas (das Sortieren und Filtern nach einem Textfeld wird wahrscheinlich immer langsamer sein als beispielsweise die Verwendung einer ganzen Zahl). Wenn Sie so groß wie lecker oder vielleicht sogar StackOverflow werden, müssen Sie wahrscheinlich Ihre Tag-Sets zwischenspeichern.

Ein weiteres Problem, dem Sie sich stellen müssen, ist das Problem der Tag-Normalisierung. Dies hat nichts mit der Datenbanknormalisierung zu tun - es ist nur sicherzustellen, dass (zum Beispiel) die Tags "StackOverflow", "Stackoverflow" und "Stack Overflow" gleich sind. Viele Orte verbieten Leerraum oder entfernen ihn automatisch. Manchmal sehen Sie das Gleiche für Interpunktion - "StackOverflow" ist das gleiche wie "Stack-Overflow". Auto-Verkleinerung ist ziemlich Standard. Sie werden sogar eine Spezialfall-Normalisierung sehen - wie "c #" dasselbe wie "csharp" machen.

Glückliches Taggen!

Ich habe eine Fotoweb site und ich möchte Umbauten stützen, während meine ursprüngliche Kategorie bucketing anfängt zu scheitern (einige Bilder sind Familie und Ferien oder Schule und Freunde). Gibt es ein vereinbartes Tagging DB-Schema?

Ich möchte weiterhin Fotos als Teil eines Albums unterstützen.

Im Moment habe ich ein paar Tische:

Fotos

  • Lichtbildausweis
  • FotoAlbumID
  • Bildbeschriftung
  • Datum

Fotoalbum

  • AlbumID
  • Albumname
  • Albumdatum

Ich schlage vor zu sehen, wie etablierte Open-Source-Software es tut. Zum Beispiel speichert Gallery seine Metadaten in einer Datenbank wie Sie und ist ziemlich reich.

Ich glaube nicht, dass Sie ein "Standard" -Schema finden werden. Am ehesten denke ich an das EXIF-Metadatenformat, das in Bilddateien selbst eingebettet ist (durch Kameras usw.).


So etwas kommt mir in den Sinn: Fügen Sie diese beiden Tische hinzu

Stichworte

  • TagID
  • Verlinke den Namen
  • Tagbeschreibung

Foto-Tags

  • Lichtbildausweis
  • TagID

Sie können dies auch auf Alben erweitern, indem Sie eine Kreuzungstabelle zwischen Fotoalben und Tags haben.


Wenn Sie eine echte Leistung mit Millionen von Datensätzen wünschen, können Sie Tags in einem Feld speichern, durch Kommas trennen und Datensätze mit einem Volltextindex / Suchdämon wie sphinxsearch abrufen. Alles, was Sie hinzufügen müssen, ist eine Tabelle, die alle Tags mit einem Zählwert auflistet, um zu wissen, wie oft sie an ein Objekt angehängt sind.

Ich weiß, es ist nicht der übliche Weg und etwas komplizierter als eine reine Datenbanklösung, aber es ist wirklich sehr schnell, tagbezogene Artikel zu suchen.

Sie könnten auch die Volltext-Suchfunktionalität Ihrer Datenbank-Engine verwenden, aber wenn viele Datensätze vorhanden sind, tendieren die meisten Engines dazu, langsam zu sein.

Wenn es sich um ein kleines Projekt handelt, können Sie Ihren Weg gehen, gute und gute Wege machen. Aber ich würde diese andere Lösung nur mit Ihnen teilen. Was halten Sie von ?


Es gibt verschiedene Schemas, die effektiv sind, jedes mit seinen eigenen Leistungsimplikationen für die häufigen Abfragen, die Sie benötigen, wenn die Anzahl der getaggten Elemente wächst:

Persönlich mag ich eine Tag-Tabelle und eine Link-Tabelle, die Tags mit Elementen assoziiert, da es denormalisiert wird (keine Duplizierung von Tag-Namen) und ich kann zusätzliche Informationen in der Link-Tabelle speichern (wenn das Element beispielsweise markiert wurde).

Sie können auch einige demormalisierte Daten hinzufügen, wenn Sie verspielt sind und einfache Auswahlen auf Kosten der zusätzlichen erforderlichen Datenwartung durch Speichern von Nutzungszählungen in der Tag-Tabelle oder durch Speichern von Tag-Namen, die in der Elementtabelle selbst verwendet wurden, um Schläge zu vermeiden, benötigen. die Link-Tabelle und die Tag-Tabelle für jedes Element, die nützlich ist, um mehrere Elemente mit all ihren Tags anzuzeigen und für die einfache Tag-Versionierung ... wenn Sie auf so etwas sind;)







tagging