2016-03-30 15 views
0

私は、インタビューで同義語のトラックを保持する辞書のデータベースを設計するように頼まれました。同義語の部分はインタビューの後の質問でした。 1に等しいid6972有する単語がシソーラスをSQLデータベースで設計する最良の方法は?

次いで同義語である場合、私は、私は例えばテーブルに

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

した単語に単語を関連付けること

Words 
============= 
id | ... 
============= 
1 | . 
2 | . 
. | . 
. | . 

などのようなテーブルを持っていました

 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 

ていない私は、このすべてを確実にするためにデータベースを構成するための最良の方法を思ったんだけど。私は(インタビューで)提案して

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 [email protected]) 
    BEGIN 
     INSERT INTO Synonyms (wordA_id,wordB_id) VALUES (@idA,@idB) 
    END 
  • のように、このすべてをチェックSPROCてsynynomsを挿入されて、私のT-SQL構文のいずれかのバグがありますか?
  • シノニムを挿入する唯一の方法は、この手順でロジックがすべてのケースをカバーすると仮定し、Synonymsテーブルのサイズを爆発させないようにしますか?
  • このシノニムパターンを最初から設計する方が良いでしょうか?
  • ところで、T-SQLではXORスワップが可能ですか?
+0

Wでありますあなたがまだインタビューをしているのであれば、シノニムのテーブルスキーマにソートのための数字の 'rank'カラムを追加したいと思うでしょう。類義語辞典を見るときは、与えられた単語の同義語は、通常、あなたの言葉にどれほど似ているかの順に並べられています。これはまた、双方向マップの最適化が機能しないようにします。最適化は不要です。 –

答えて

1

私が見るバグは1つありますが、構文にはありませんが、論理的です。 IF NOT EXISTSには、where節にwordA_IdwordB_Idの両方を含める必要があります。
また、データベースの説明からは分かりませんが、wordsテーブルの単語には、Synonymsテーブルの両方の列の組み合わせだけでなく、ユニークなインデックスが必要です。

より良いデータベース設計が存在するかどうかはわかりませんが、別のオプションがあり、それがワードテーブルの自己参照を使用しています。ただし、自己参照列にはNULL値を設定する必要がありますが、すべての主要データベースで完全にサポートされていますが、frowned uponです。
は、XORスワップについての質問に答えるために - それは、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 
0

はたぶん、あなたはSynonymId参照という名前のWordテーブルに新しいフィールドを追加することができます新しいテーブルは、あなたがSynonymId(非ユニーク)、WordIdを保つことができる。このシノニムテーブルで

シノニムの名前

だからあなたは同じSynonymIdがここWordId

以上の単語を結合して、その行のフィールドSynonymIdに

クエリシノニムを読んで、単語の同義語の一覧を取得したいとき同義語リストを選択する方法ですここ

テーブル構造とサンプルデータと

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表す同義語

関連する問題