我有一个包含大约7000个测验问题的表(它将会增长)。每个问题都有一个标签列表。
例如,问题"在7月的第三个星期五的周末举行哪个高尔夫比赛?"有标签"运动,高尔夫,星期几"。
将标记存储在SQL数据库中的最佳方法是什么?
目前它们存储为字符串,当我需要它时,我会做一些绝对丑陋的字符串操作。
我需要能够轻松添加新标签(我正在考虑使用https://sean.is/poppin/tags/),而最简单和最好的方式似乎是使用数组。当然,我可以将此数组更改为字符串,但将字符串更改为数组然后再将其更改为错误。
我还需要能够列出具有特定标签的所有问题。我不想使用通配符,因为这会产生一些问题。例如,如果我要求ART,我也可以获得pARTnerships。
规范化一个数组,然后将它放入数据库有点工作,但如果我要求列出所有标签,那将是一团糟。
由于
答案 0 :(得分:1)
通常,您不应将数组存储为数据库中的字符串。它使得更难获取它们并迫使您创建更多代码以便在以后解压缩并使用它们。
我建议在主表中添加一个带有密钥的新表。
<强>问题强>:
.image_thumbnail {
width: calc((100%*9)/16);
}
<强>代码:
| uid | question |
| 1 | Which golf... ...third Friday in July? |
| 2 | How many golfers... ...screw in lightbulb? |
这样您就可以轻松地使用特定标记提取每个问题,并轻松列出特定问题的每个标记。
| uid | questionid | tag |
| 1 | 1 | Sport |
| 2 | 1 | Golf |
| 3 | 1 | Days of the Week |
| 4 | 2 | Joke |
| 5 | 2 | Golf |
| 6 | 2 | Lightbulb |
$tags = query("SELECT tag FROM tags WHERE questionid='2'");
//returns list of tags from question with ID 2
如果要将所有内容保存在一个表中,则可以使用JSON。您可以在数据库中存储JSON数组,因为它只是一个字符串。
所以,在PHP中,假设你有一个标签数组:
$questions = query("SELECT questionid FROM tags WHERE tag='Golf'");
//will return all questionids with tag "Golf"
现在,您希望将其存储到数据库中,因此您只需使用$tags = ["Sport", "Golf", "Days of the Week"];
:
[json_encode()](http://php.net/manual/en/function.json-encode.php)
现在$tags = json_encode($tags);
可以安全地存储在您的数据库中,以后当您需要它们时,您需要做的只是json_decode()
:
$tags
现在,用这种方式搜索具有特定标签的问题仍然非常容易。 假设您要列出所有带有标记&#34; Sport&#34;的问题,您可以通过以下方式执行此操作:
$tags = json_decode($tags_from_db, true);
答案 1 :(得分:0)
我会建议一个多对多的sql表。这是一个例子: Fiddle
create table quiz_questions (id INT AUTO_INCREMENT PRIMARY KEY, question TEXT, answer TEXT);
create table quiz_tags (id INT AUTO_INCREMENT PRIMARY KEY, tag TEXT);
create table quiz_questions_tags (question_id INT, tag_id INT);
insert into quiz_questions(question, answer) VALUES ('q1','a1');
insert into quiz_questions(question, answer) VALUES ('q2','a2');
insert into quiz_questions(question, answer) VALUES ('q3','a3');
insert into quiz_tags(tag) VALUES ('sports');
insert into quiz_tags(tag) VALUES ('history');
insert into quiz_tags(tag) VALUES ('other');
insert into quiz_questions_tags(question_id, tag_id) VALUES (1,1);
insert into quiz_questions_tags(question_id, tag_id) VALUES (2,2);
insert into quiz_questions_tags(question_id, tag_id) VALUES (3,3);
insert into quiz_questions_tags(question_id, tag_id) VALUES (3,2);
insert into quiz_questions_tags(question_id, tag_id) VALUES (3,1);
SQL查询:
select q.* from quiz_questions q, quiz_tags t, quiz_questions_tags qt where q.id = qt.question_id and t.id = qt.tag_id
and t.tag = 'sports'