0

我在开始这个想法时遇到了麻烦。我有一个 SQL 数据库和一个带有 JAVA/Apache(tomcat) 的 html 接口。我试图创建一个简单的数据库,对歌曲名称进行排序并匹配关于歌曲的关键字。示例我输入了诸如“史诗,电影,女王,唱歌”之类的关键字,而像波西米亚女王狂想曲这样的歌曲符合大多数标准,它是“电影”中的“史诗”歌曲并由“女王”执行,因此这将制作值为 3。并且在数据库中,我们是冠军之类的歌曲将满足所有关键字(史诗、电影、女王、歌唱)-> 所以这首歌将是 4。

我已经涉足了 sql 和一些 JAVA 代码中的计数函数,但我无法找到一种方法来转换关键字,或者计算它们以查看哪个结果更好。

我应该在哪里学习如何制作这样的东西?


非常感谢您的解释和链接。经过数小时的阅读和重新阅读,我对数据库结构有了更多的了解。并有一个近乎功能的网页。我有最后一个问题。查询给了我 song_ID 和计数的结果。我想了一些方法来让歌曲名称也显示出来。

我的第一个想法是将名称添加到连接表中。

第二是创建一个临时表(视图),然后使用该信息从其他表中查找数据。

第三是编写一个java代码来获取原始结果,然后只显示歌曲名称和数量。……

我认为我缺少一些简单的 SQL 能力来更好地(并且更有效地)处理数据。

4

2 回答 2

1

假设您的数据库有两列:tag 和 song_id,如下所示:

CREATE TABLE tags(tag STRING KEY, song_id INT);

然后您可以在 SQL 查询中执行所有操作:

SELECT song_id, count(*)
FROM tags
WHERE tag IN ("epic", "movie", "queen", "sing")
GROUP BY song_id
ORDER BY count(*) DESC;

如果您想要更复杂的文本搜索,即如果这个解决方案最终太慢,您应该查看 Apache Lucene和/或Solr

于 2012-08-23T23:10:04.380 回答
0

三张表:

  • song_id主键为整数的歌曲
  • tag主键为字符串的标签
  • song-tags 是一个连接其他两个表的连接表。它将有一个复合主键song_idtag

因此,如果在歌曲中我们有这些行(元组):

  • 歌曲ID:1;名称:波西米亚狂想曲
  • 歌曲ID:2;名称:我们是冠军

在标签中我们有:

  • 标签:史诗
  • 标签:电影
  • 标签: 女王
  • 标签: 唱

然后在歌曲标签中,我们将拥有:

  • 歌曲ID:1;标签:史诗
  • 歌曲ID:1;标签:电影
  • 歌曲ID:1;标签: 女王
  • 歌曲ID:2;标签:史诗
  • 歌曲ID:2;标签:电影
  • 歌曲ID:2;标签: 女王
  • 歌曲ID:2;标签: 唱

现在要找到与特定标签匹配的歌曲只是从歌曲标签表中选择相关行的问题。

原始设计的问题是您将多个标签存储在一行中。相反,对于与给定歌曲匹配的每个标签,您应该有一个单独的行。如果三个标签匹配,那么您将需要三行,依此类推。

您可能想阅读一些有关数据库规范化的内容,以了解为什么您的原始设计无法有效工作

(注意在 Joe K 之前的回答中,他基本上提出了同样的建议,并给了你一个 SQL 查询来确定哪些标签与哪些歌曲匹配。我刚刚充实了一些东西)

于 2012-08-24T23:46:10.767 回答