SQL [Acess/MySQL] Wie erstelle ich "tags"?

Hoeze

Lieutenant
Registriert
Juni 2010
Beiträge
707
Ich würde gerne eine Spalte mit bestimmten tags füllen können, also z.B.:
| Spalte xy
|---------------------|
|"grün", "blau", "gelb"|
|---------------------|

Wenn ich dann nach "grün" suche, sollen alle Einträge mit diesem Tag angezeigt werden.
Wie setze ich das in Access bzw. MySQL um?
 
Zuletzt bearbeitet:
Wie wärs mit Google und Lesen?
Gibt genug Beispiele im Web die man sich Anschauen kann und dann wiederkommen wenn man Probleme hat... Das Forum ist nicht dazu da das dir andere Leute die Arbeit machen...
 
Merksatz für relationale Datenbanken: The key, the whole key and nothing but the key! So help me, Codd!
 
Mojo1987 schrieb:
Wie wärs mit Google und Lesen?
Gibt genug Beispiele im Web die man sich Anschauen kann und dann wiederkommen wenn man Probleme hat... Das Forum ist nicht dazu da das dir andere Leute die Arbeit machen...

Es tut mir leid, dass ich kein SQL-Experte bin und deshalb Fragen stellen muss.
BTW: Smart Tags sind eigentlich nicht das, was ich suche.

Lawnmower schrieb:

Das kenne ich, mein Problem ist, dass ich eben MEHRERE Einträge in einem Feld benötige.
 
Ja, und genau das geht mit dem relationalen Modell nicht. Das geht nur mit NoSQL-Ansätzen, wie sie z.B. MongoDB, Redis oder, in gewissem Maße, auch MariaDB 10 bieten.
Wenn du ein RDBMS wie MySQL verwenden willst, dann musst du deine Inhalte in eine Normalform umwandeln, gemäß obigem Merksatz.
 
Daaron schrieb:
Ja, und genau das geht mit dem relationalen Modell nicht. Das geht nur mit NoSQL-Ansätzen, wie sie z.B. MongoDB, Redis oder, in gewissem Maße, auch MariaDB 10 bieten.
Wenn du ein RDBMS wie MySQL verwenden willst, dann musst du deine Inhalte in eine Normalform umwandeln, gemäß obigem Merksatz.

=> ich muss mir mit bspw. PHP die einzelnen Verweise herauslesen und dann einzeln auflösen...
Gibt es da nicht einen Weg das auch in Access zu lösen?

Mein Problem ist, dass ich da was für meine Eltern machen soll, aber sie wollen es möglichst einfach haben, also wenn möglich ohne gleich einen Web-/SQL-Server aufsetzen zu müssen...
 
Du könntest SQLite benutzen. Ansonsten würde Access unter der Haube lokal auch eine Datenbank einbinden. Da du jedoch mehrere Einträge in einem Feld brauchst geht das wie bereits von den anderen beschrieben nicht mit relationalen Datenbanken.
 
Ok. Weil du wohl wirklich nicht begreifst, worauf es raus läuft:

Tabelle 1 - enthält deine Objekte, die du taggen willst. Jedes Objekt hat ne eindeutige ID
Tabelle 2 - enthält all deine möglichen Tags, jeder Tag hat ne eindeutige ID
Tabelle 3 - enthält alle verwendeten Verknüpfungen von Objekten und Tags, ohne Primary Key
 
Mit Access geht das tatsächlich. Dort kann man beim Felddatentyp den Nachschlage-Assistenten bemühen, und dort eine Liste mit Werten per Hand eingeben oder aus einer anderen Tabelle erzeugen lassen. Alle ausgewählten Werte werden in diese eine Tabellenspalte geschrieben.

Sinnigerweise sollte man es aber so machen, wie Daaron beschreibt.
 
Nase schrieb:
Sinnigerweise sollte man es aber so machen, wie Daaron beschreibt.
"Sinnigerweise" wird es aber nur so gemacht, weil das relationale Datenmodell und die Normalformen es so fordern. Aus einem anderen Sichtwinkel betrachtet ist das relationale Datenmodell eigentlich das unsinnigste überhaupt. Denn unsere Datenmodelle in Programmiersprachen sind Aggregierte Modelle, wir haben nicht einfach wie bei relationalen Datenbanken eine flate Datenstruktur, ein "Objekt" hat Unterobjekte, es hat Sets usw.
Somit muss immer eine Konvertierung zwischen objektorientierten Daten und der relationalen Datenbankstruktur stattfinden, es gibt einen Impediance Mismatch.

Aber es einfach nur schlecht darzustellen, ist auch falsch. Denn die relationale Datenbank erlaubt einem damit die Daten so zu speichern, dass sie auf vielfache Weise durchsucht werden kann. Es bietet Safety-Checks (Datentyp der Spalte, CHECK Constraints, Foreign Keys usw..)...


Der Weisheit letzter Schluss sind weder relationale Datenbanken noch NoSQL-Datenbanken. Allerdings ist das von Daaron genannte Dynamic Columns in MariaDb 5.3 (nicht v10) ein Schritt in die richtige Richtung, beides miteinander sinnvoll zu verschmelzen. Aber erst der Anfang (man kann keine Indexe nutzen). In PostgreSQL ist das auch als Hstore- sowie JSON-Erweiterung verfügbar. Mit der Möglichkeit sogar Indexe zu kombinieren und weiterhin die ACID-Kriterien einer relationalen Datenbank zu haben und nicht alles schemaless speichern zu müssen sondern nur eventuell wenige Attribute.

Meiner Meinung nach ist so ein dynamic columns Feature für tagging haargenau das richtige. Es wurde nur früher immer relational designed, weil es anders nicht möglich war.
 
In MariaDB 10 gibts auch JSON und einige andere größere Änderungen an den Dynamic Columns...
Was das Indexing angeht: Monty sagt "kommt, wenn Dynamic Columns wirklich großflächig genutzt werden". Bis dahin soll man Virtual Columns verwenden.
Man kann aber auch bei MySQL einfach faul sein und die Tags als serialisiertes Array speichern... macht nur die Abfragen unglaublich schwer.

Relationale Datenbanken sind natürlich nicht der Weisheit letzter Schluss, aber sie haben ihren Nutzen. Manche Sachen haben klare Relationen (z.B. Warenkorb in einem Shopsystem), andere Sachen eben nicht.
 
Daaron schrieb:
Bis dahin soll man Virtual Columns verwenden.
Das hat er wirklich gesagt? :freak:
Virtual Columns und Dynamic Columns lösen ja komplett verschiedene Probleme...

JSON Functions kommen auch in MySQL 5.7 - mal sehen wer von beiden da schneller ist. Leider auch ohne Indexing-Support :( Natürlich gehen auch serialisierte Arrays, aber imho taugt eine Lösung nichts, wenn ich keine Indexe dafür erstellen kann.
 
Wieso schneller? MariaDB 10 ist bereits stable... Das Rennen hat MySQL schon lange verloren.

Yes, currently dynamic columns can't be easily indexed. You 'can' do an index with the help of a virtual column, but that is not that convenient as you then duplicate the information for that column.
https://mariadb.com/kb/en/indexoptimizations-in-dynamic-columns/#comment_142

Ich finde aber, für Tags eignet sich der relationale Aufbau tatsächlich noch recht gut. SELECT objekt_id FROM tags WHERE tag_id='123'; <- das ist ja nun eine doch recht häufig ausgeführte Anfrage: Tag in ner Tag-Cloud anklicken und alle Objekte sehen, die diesen Tag haben.
 
MariaDB 10.0.4 ist immernoch Alpha ;)
Also sollte ich es konkretisieren: Es wird interessant welcher von beiden schneller das GA-Release schafft. Der MariaDB 10er Branch ist leider schon sehr lange offen, kann den Tag nicht abwarten, an dem es final wird. Galera Cluster in dem ersten MySQL-Fork als stable deklariert :)
 
Hm... Tatsache... die 10 taucht in allen möglichen Repositories auf, da ging ich ernsthaft von Stable oder wenigstens Beta aus, nicht Alpha.
 
Zurück
Oben