2016-12-13 1 views
0

Angenommen, ich brauche ein Feld namens skills in meiner Tabelle.Es sollte verschiedene Fähigkeiten einer Person wie php, java, Golang speichern.Suche ein Feld mit mehreren Werten

Was wäre die entsprechende Ansatz sein, solche Daten in der Datenbank zu speichern, so dass sie durch Geschicklichkeit leichter

Edit 1

Der Benutzer eingeben etwas machen sucht, kann er für Fähigkeiten will, oben war einfach ein Beispiel

der Benutzer kann eine oder mehr Fähigkeiten in dem Text eingeben durch Kommata

Beispiel getrennt,

skill1,skill2,skill3 
+0

Vielleicht könnten Sie ein Beispiel dafür geben, was Sie mit ** Edit 1 ** meinen. – gmiley

+0

Verstehe nicht, warum dies abgelehnt wurde! Es ist eine ziemlich gute Illustration des Falls, in dem 'SET'-Spalten verwendet werden. – cFreed

Antwort

0

Was wäre die entsprechende Ansatz, solche Daten zu speichern, in der Datenbank

Sie sollten eine separate Tabelle Skills genannt haben, wo alle Fähigkeiten vorhanden sein, und es sollte auch eine FOREIGN KEY haben Bezug auf die Elterntabelle PRIMARY KEY Feld.

Damit bei Bedarf kann man JOIN mit übergeordneten Tabelle und GROUP BY der übergeordneten Tabelle Schlüsselfeld (GROUP_CONCAT(), wenn Sie alle Fähigkeiten aufgelistet werden sollen) und erhalten Sie alle damit verbundenen Fähigkeiten

2

Sie sollten wahrscheinlich Ihre Design-Ansatz zu überdenken und Speichern Sie diese Fähigkeiten in einer verwandten Tabelle namens skills mit Spalten skill_id und skill_name und skill_desc, etc ... dann verwenden Sie eine Querverweistabelle, um person_id von Ihrer Tabelle von Menschen und die skill_id von der skills Tabelle zu verknüpfen.

Wenn Sie ein Redesign nicht ausführen können, können Sie eine Abfrage mit einer Reihe von LIKE Anrufe verwenden:

SELECT * 
FROM people 
WHERE skills LIKE '%php%' 
    OR skills LIKE '%java%' 
    OR skills LIKE '%Golang%'; 

Aber das ist ziemlich schlampig. Ich würde mit einem Redesign gehen. Durch die Verwendung von LIKE wird jeder Vorteil von Indizes zunichte gemacht.

Um in den obigen mehrfachen Tabellen zu expandieren, wenn ein Benutzer eine Liste von kommagetrennten Skills eingibt, müssten Sie diese in einer Sammlung/einem Array analysieren und in der neuen Tabelle skills nach ihrer Anwesenheit suchen. Wenn es nicht existiert, fügen Sie es ein. Dann, oder wenn es existiert, ziehen Sie die skill_id und fügen Sie diese in die person_skills_xref Tabelle mit der person_id (wenn diese Kombination nicht bereits existiert). Auf diese Weise

können Sie dann wie eine select-Anweisung tun:

SELECT s.skill_id, s.skill_name, s.skill_desc 
FROM skills s 
JOIN people_skills_xref ps 
ON s.skill_id = ps.skill_id 
WHERE ps.person_id = @personID; 

, dass Sie alle die Fähigkeiten für die Person, mit der person_id von @personID erhalten.

Oder Sie können alle Menschen in der people Tabelle mit einer bestimmten skill_id mit der folgenden Abfrage wählen:

SELECT p.person_id, p.person_name, p.person_email 
FROM people p 
JOIN people_skills_xref ps 
ON ps.person_id = p.person_id 
WHERE ps.skill_id = @skillId; 

Oder von skill_nameLIKE mit:

SELECT p.person_id, p.person_name, p.person_email 
FROM people p 
JOIN people_skills_xref ps 
ON ps.person_id = p.person_id 
JOIN skills s 
ON s.skill_id = ps.skill_id 
WHERE s.skill_name LIKE @skillName; 

Wo @skillName enthalten würde ein Suchzeichenkette von '%sql', um mit allem zu enden, das in sql endet, wie mysql, pl/sql oder nur sql.

+0

check edit ... Benutzer kann alles für Fähigkeiten eingeben, so dass ich nicht weiß, Fähigkeiten im Voraus – user2650277

+0

Ich bin mir nicht sicher, wie das ändert, was ich empfahl. Mit einer M: M-Beziehung von "people" zu "skills" über eine "people_skills_xref" -Tabelle können Sie eine beliebige Anzahl von Skills auf beliebig viele Personen in beliebiger Kombination anwenden. Außerdem duplizieren Sie Ihre Fähigkeiten nicht. Es würde nur einen Eintrag in der "Skills" -Tabelle benötigen. – gmiley

1

sollten Sie 3 Tabellen verwenden:

User 
----------------- 
id 
name 

Skill 
----------------- 
id 
name 

User_Skill 
----------------- 
user_id 
skill_id 

Tabelle Benutzer alle Benutzer enthält, enthält Tabelle Fähigkeiten alle verfügbaren Fähigkeiten und Tabelle User_Skills kommen Sie mit den beiden Tabellen. Wenn Sie also einem Benutzer eine Fähigkeit hinzufügen möchten, sollten Sie einen Wert in die Tabelle User_Skill eingeben.

Wenn Sie alle Fähigkeiten eines Benutzers abrufen möchten, können Sie verwenden:

select s.* from Skills s left join User_Skills us on us.skill_id = s.id where us.user_id = <insert user id>; 
+0

[_Optimal Many: Viele Tabellenschema_] (http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table). –

1

IMO desto einfacher (und leicht verwendet werden, zur gleichen Zeit) Art und Weise für das, was Sie brauchen, ist eine einzigartige Spalte zu verwenden, vom SET-Typ.

Grund Zusammenfassung, wie es funktioniert:

  • Definition des Feldes: so etwas wie skills SET('php','java','goLang',...)

  • das Feld (auf einmal mit einem oder mehreren Fähigkeiten) bevölkern: UPDATE table SET skills = 'php, java'

  • Suche nach einer bestimmten Fähigkeit: SELECT * FROM table WHERE FIND_IN_SET('java', skills) > 0

Betrachten Sie diese MySQL page, vorausgesetzt, MariaDB sollte die gleichen Funktionen bieten.

WICHTIGER HINWEIS: Ich denke, das die nur Methode gibt Ihnen die leistungsstarke benötigt, wegen etwas, das man nicht eindeutig in Ihrem OP sagte hat, ist aber wahrscheinlich eine Voraussetzung: eine bestimmte Person mehrere Fähigkeiten haben !

2. Wichtiger Hinweis: Die Bearbeitung des OP Staaten

Der Benutzer etwas eingeben kann er für Fähigkeiten will

Dies ist der einzige Punkt, an dem SET nicht direkt nach Bedarf funktioniert, da die verschiedenen möglichen Werte auf der Spaltendefinitionsebene registriert werden müssen (aber offensichtlich aktualisiert werden können, um sich zu entwickeln).
Wenn der Benutzer also eine derzeit unbekannte Fertigkeit angeben möchte, müssen Sie ihm eine Möglichkeit anbieten, für diese neue Fertigkeit zu "reklamieren", diese dann in der Definitionsspalte registrieren und den Benutzer skills aktualisieren.

+0

Anspruch Methode scheint awesome ... Stackoverflow-Stil :) – user2650277

+0

@ user2650277 Als nicht-englischen Muttersprachler kann ich nicht wissen, wie meine Worte klingen: von Ihren Kommentar Ich denke, ich habe nicht den richtigen Weg wählen auszudrücken .. Außerdem habe ich diese Antwort ziemlich schnell geschrieben, also ist sie etwas abgekürzt. Was ich mit "Claim for" meine, ist: Der Benutzer sollte eine Liste von (registrierten) Fähigkeiten haben, von denen er auswählen wird, was er will. Und diese Liste sollte etwas wie "Anderes" enthalten, das, wenn es ausgewählt wird, zu einem Eingabebereich führt, wo die neue Fähigkeit eingegeben werden kann. Dann sollte Ihr Backend-Skript diesen Fall erkennen und entsprechend verarbeiten (indem Sie vor der Tabellenaktualisierung das Coldef modifizieren). – cFreed

+0

Ich verstehe perfekt, was du meinst.Ich wollte sagen, dass stackoverflow auch verwendet das Vorschlagssystem Sie verweisen – user2650277

Verwandte Themen