假设我需要在我的表格中使用一个名为skills
的字段。它应该存储一个人的各种技能,例如php
,java
,Golang
。
在数据库中存储此类数据的适当方法是什么,以便更轻松地进行技能搜索
修改1
用户可以输入他想要的任何技能,上面只是一个例子
用户可以在文本框中键入一个或多个技能,以逗号分隔
实施例
skill1,skill2,skill3
答案 0 :(得分:2)
您可能应该重新考虑您的设计方法,并将这些技能存储在名为skills
的相关表格中,其中列skill_id
和skill_name
以及skill_desc
等等...然后使用一个交叉引用表,用于链接您的人员表中的person_id
和来自skill_id
表的skills
。
如果您无法执行重新设计,则可以使用包含LIKE
次调用的查询:
SELECT *
FROM people
WHERE skills LIKE '%php%'
OR skills LIKE '%java%'
OR skills LIKE '%Golang%';
但这很邋..我会重新设计。使用LIKE
将否定索引的任何好处。
要扩展上面的多个表,当用户键入逗号分隔技能列表时,您需要将其解析为集合/数组,检查它们是否存在于新的skills
表中。如果它不存在,则插入它。然后,或者如果它确实存在,则拉出skill_id
并将其插入带有person_skills_xref
的{{1}}表中(如果该组合尚不存在)。
然后,您可以执行以下选择语句:
person_id
这将为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;
person_id
人提供所有技能。
或者您可以使用以下查询选择@personID
表中具有特定people
的所有人:
skill_id
或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;
使用skill_name
:
LIKE
其中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;
将包含@skillName
的搜索字符串,以匹配以'%sql'
结尾的任何内容,例如sql
,mysql
或{{1} }}
答案 1 :(得分:1)
你应该使用3个表:
msg
表用户包含所有用户,表技能包含所有可用技能,表User_Skills包含两个表。因此,如果要向用户添加技能,则应在表User_Skill中插入值。
如果您想要检索用户的所有技能,可以使用:
- debug: msg={{ansible_mounts|map(attribute='mount')|join(', ')}}
答案 2 :(得分:1)
IMO更简单(并且易于使用,同时)的方式,您需要的是使用SET类型的唯一列。
工作原理的基本概要:
字段的定义:类似skills SET('php','java','goLang',...)
填充字段(一次使用一项或多项技能):UPDATE table SET skills = 'php, java'
寻找特定技能:SELECT * FROM table WHERE FIND_IN_SET('java', skills) > 0
看看这个MySQL page,假设MariaDB应该提供相同的功能。
重要说明:我认为这是唯一方法,为您提供所需的强大功能,因为您在OP中没有明确说明的内容,但很可能是一个要求:给定的人可能有几种技能!
第二重要注意:OP的编辑状态
用户可以输入他想要的任何技能
这是SET
根据需要不直接工作的唯一一点,因为必须在列定义级别注册不同的可能值(但显然可以是更新为进化)
因此,如果用户想要提及一些当前未知的技能,您必须向他提供一种方式来声明"声称"注册此新技能,然后在定义列中注册,并实际更新用户skills
字段。
答案 3 :(得分:0)
将这些数据存储在中的适当方法是什么? 数据库
您应该有一个名为Skills
的单独表格,其中应该存在所有技能,并且还应该FOREIGN KEY
引用父表PRIMARY KEY
字段。
这样,在需要时,您可以使用父表JOIN
和GROUP BY
父表键字段(GROUP_CONCAT()
,如果您想列出所有技能)并获得所有相关技能< / p>