我在求职面试中被要求为数据库设计数据库,以保存同义词的轨迹。同义词部分是后来的一个问题。我有一张像
这样的桌子 Words
=============
id | ...
=============
1 | .
2 | .
. | .
. | .
所以将单词与我制作表格的单词联系起来
Synonyms
======================
wordA_id | wordB_id
======================
. | .
. | .
. | .
例如,如果id
等于1
,69
和72
的字词是同义词,那么
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
Synonyms
表的大小不会爆炸?答案 0 :(得分:1)
我看到有一个错误,但它不是语法,而是逻辑。
IF NOT EXISTS
应包含wordA_Id
和wordB_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