SQL如何保存同义词/替代词

时间:2014-05-07 09:09:53

标签: sql ruby

我想知道如何在数据库中保存同义词。例如:

  1. Word school有的同义词包括:college,academy
  2. 如果我提出“学校”的回复应该包含[学院,学院] 否则,如果我写大学,我想得到[学校,学院]
  3. 我想到了一个有一列的桌子,我将有

    college,academy,school,
    

    然后我用

    查询表格
    SELECT * FROM synonyms WHERE word LIKE 'school'
    

    这个问题很好解决了吗?也许更好的方法是使用两个表?谢谢你的所有答案。

2 个答案:

答案 0 :(得分:0)

我个人会使用一个表words与多对多连接称为同义词。所以实际上它是两个表,words id:integer, word:string,第二个synonyms_wordsword_id:integer, synonym_id:integer。然后你的SQL查询将是:

SELECT synonyms.word 
  FROM words 
    INNER JOIN synonyms_words 
      ON synonym_words.words_id = words.id
    INNER JOIN words AS synonyms
      ON synonyms_words.synonyms_id = synonyms.id
  WHERE words.word = 'school'

答案 1 :(得分:0)

你的解决方案没问题但不好。是的,您可以将一组同义词视为一个实体并将其存储起来。 (你可以用分隔符开始和结束每个组,即',大学,学院,学校',以便能够询问'%,school,%'等词。但是查找单词总会导致完整表扫描,效率不高。

此外,为了显示'school'的同义词,你想要显示'大学,学院'而不是',大学,学院,学校'。也许有人想查找'academy'的其他同义词。因此,您突然处理单个单词而不是仅处理同义词组。因此,不再建议将单词存储为连接字符串。

你需要的是一张单词表。而且你需要同义词组。

您可以使用两个表执行此操作,一个包含单词,另一个用于同义词组:

Table words:

id | word
---+----------------
1  | college
2  | school
3  | academy
4  | group of fish

Table groups:

id | id_word
---+----------------
1  | 1
1  | 2
1  | 3
2  | 2
2  | 4

或者用一张桌子来做:

Table groups:

group_id | word
---------+----------------+
1        | college
1        | school
1        | academy
2        | school
2        | group of fish

这两种方法都具有易于访问,维护,存储等方面的优势。