在SQL数据库中设计同义词库的最佳方法?

时间:2016-03-30 06:43:08

标签: sql sql-server algorithm tsql database-design

我在求职面试中被要求为数据库设计数据库,以保存同义词的轨迹。同义词部分是后来的一个问题。我有一张像

这样的桌子
    Words
=============
id |  ...
=============
 1 |   .
 2 |   .
 . |   .
 . |   .

所以将单词与我制作表格的单词联系起来

       Synonyms 
======================
 wordA_id | wordB_id
======================
     .    |    .
     .    |    . 
     .    |    .

例如,如果id等于16972的字词是同义词,那么

     1    |    69
     69   |    72

可能是Synonyms中的条目。但也可能

     1    |    69
     1    |    72

我意识到了。配对顺序并不重要,所以

     69   |   1
     1    |   72

也是如此。我们可能不希望任何订单的重复记录,所以像

     69   |   1
     1    |   72
     69   |   1

     69   |   1
     1    |   72
     1    |   69

我想知道配置数据库的最佳方法,以确保这一切。我建议(在采访中)通过一个检查所有这些的sproc插入synynoms,如

CREATE PROCEDURE InsertSynonym
   @idA INT,
   @idB INT
AS
   -- make @idA the smaller if it isn't already
   IF @idA > @idB 
   BEGIN
      @DECLARE @temp INT
      SET @temp = @idA
      @idA = @idB
      @idB = @temp
   END
   -- insert if not already there
   IF NOT EXISTS (SELECT * FROM Synonyms WHERE wordA_id=@idA)
   BEGIN
      INSERT INTO Synonyms (wordA_id,wordB_id) VALUES (@idA,@idB)
   END
  • 我的T-SQL语法中是否有任何错误?
  • 假设插入同义词的唯一方法是通过这个过程,逻辑是否覆盖所有情况并且是否保持Synonyms表的大小不会爆炸?
  • 有什么更好的方法来设计这个同义词模式?
  • 顺便说一句,是否可以在T-SQL中进行XOR交换?

2 个答案:

答案 0 :(得分:1)

我看到有一个错误,但它不是语法,而是逻辑。 IF NOT EXISTS应包含wordA_IdwordB_Id中的where子句。
此外,您对数据库的描述并不清楚,但单词表中的单词应该有唯一索引,以及同义词表中两列的组合。

我不确定是否存在更好的数据库设计,但还有另一种选择,即在单词表中使用自引用。但是,这需要自引用列可以为空,虽然所有主要数据库都完全支持它,但frowned upon。 要回答关于xor swap的问题 - 可以在t-sql中使用:

DECLARE @A int = 5, @B int = 7;

SELECT @A as A, @B as B

SELECT  @A = @A ^ @B,
        @B = @A ^ @B,
        @A = @A ^ @B

SELECT @A as A, @B as B

结果:

A           B
----------- -----------
5           7


A           B
----------- -----------
7           5

答案 1 :(得分:0)

也许你可以在名为 SynonymId 的Word表格上添加一个新字段,引用一个名为Synonyms的新表

在此同义词表中,您可以保留 SynonymId (非唯一), WordId

因此,当您想获取单词的同义词列表时,请阅读该行的字段SynonymId

使用相同的SynonymId查询同义词加入WordId上的单词

以下是如何选择同义词列表,可以使用表结构和样本数据进行查询

create table words(wordid int, word varchar(100), synonymid int)
create table synonyms(synonymid int, wordid int)
insert into words values (1, 'synonym', 1), (2, 'equivalence', 1), (3, 'opposite', null), (4, 'sameness', 1), (5, 'similarity',1 )
insert into synonyms values(1,1),(1,2),(1,3),(1,4)


declare @word varchar(100) = 'sameness'

SELECT
@word as word,  STUFF(
    (
select
    ',' + sw.word
from words w
left join [synonyms] s on s.synonymid = w.synonymid
left join words sw on s.wordid = sw.wordid
where
    w.word = @word
FOR XML PATH('') 
), 1, 1, ''
  ) As synonyms

这是代表同义词的how to concatenate strings in SQL