我有一张表来存储书名。每当我插入新标题时,我想检查,如果标题已经存在。问题在于,由于拼写错误,无法进行完全匹配。
例如
'My Dream of Wonder Land'
'My Deam of Wonder Land'
所以我的目标是为每个标题创建标签,每本书最多包含3个标签。这些标签是标题中最长的3个单词:
'My Dream of Wonder Land' = dream, wonder, land
'My Deam of Wonder Land'= deam, wonder, land
现在当我添加标题时,我想找到所有标题,至少有两个匹配的标签。应忽略标签的顺序,这意味着
'land, dream, lego'
也应该匹配。
在MySQL中存储数据的最佳方法是什么?
答案 0 :(得分:0)
我建议使用fuzzy matching,因为这些比较可能非常复杂。
也就是说,您使用标签的想法听起来更有趣。
我可能只有标签表并垂直存储它们。
CREATE TABLE BookTag (
BookId INT,
Tag NVARCHAR(50))
然后在插入书籍时,您首先要计算标签并将它们存储在临时表中。我会编写一个函数,从字符串中获取n th 最大的单词。对于这个例子,我只是假设这个函数存在并被称为nthLargestWord(VARCHAR expression, INT n)
。
INSERT INTO TEMPORARY NewBookTag (Tag)
SELECT nthLargestWord(@booktitle, 1)
UNION
SELECT nthLargestWord(@booktitle, 2)
UNION
SELECT nthLargestWord(@booktitle, 3)
您现在可以将此表格加入现有代码表中,看看是否有2个共同点。
SELECT e.BookId
FROM NewBookTag n
INNER JOIN BookTag e ON n.Tag = e.Tag
GROUP BY e.BookId
HAVING COUNT(*) >= 2
当它为假时,你可以将它放在IF EXISTS
插入中。
插入图书后,您已准备好插入标签了!
INSERT INTO Book (BookTitle)
VALUES (@BookTitle)
INSERT INTO BookTag (BookId, Tag)
SELECT b.BookId, t.Tag
FROM Book b
INNER JOIN NewBookTag t ON b.Title = @booktitle
此解决方案允许您一次插入一本书,如果需要,可以重构以允许多个。