2014-05-07 30 views
0

我想知道如何在数据库中保留同义词。例如:SQL如何保持同义词/替代词

  1. 道学校有同义词,如:大学,学院
  2. 如果我把在形式上“学校”的响应应该包含[大学,学院] 否则,如果我写的大学,我想[学校,学院]

我想到了一个表,一列在那里我将有

college,academy,school, 

然后我查询表

SELECT * FROM synonyms WHERE word LIKE 'school' 

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

回答

0

我个人使用一个表words与多对多连接称为同义词。所以实际上它将是两个表,wordsid: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' 
0

您的解决方案是好的,但不好。是的,你可以看到一组同义词作为实体并存储它们。 (尽管你可以使用分隔符来开始和结束每个分组,例如'大学,学院,学校',以便能够询问'%,school,%'等词。)然而,查找单词总是会导致整个表扫描,这是不高效的。

此外,要显示“学校”的同义词,您希望显示“大学,学院”而不是“大学,学院,学校”。也许人们会想要查找“学院”的其他同义词。所以你突然处理单个单词而不是只处理同义词组。所以将这些单词作为连接字符串存储不再是可取的。

你需要的是一个单词表。你需要同义词组。

你可以用两个表,一个单词和一个用于同义词组做到这一点:

 
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 

两种方法各有优点便于访问,维护,存储等。