2016-03-30 19 views
0

Bir iş görüşmesinde, eş anlamlılarını izleyen bir sözlük için veritabanını tasarladım. Eşanlamlı kısım röportajda daha sonraki bir sorundu. IBir SQL veritabanında eş anlamlılar tasarlamanın en iyi yolu?

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

gibi bir tablo ve bu yüzden bir tablo Örneğin

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

ifadesi ile id eşit 1, 69 ve 72 eş sonra

ise yapılan kelime kelime ilişkilendirmek
 1 | 69 
    69 | 72 

, Synonyms numaralı girişte olabilir. Ancak, farkettim ki,

Anladım. Ve eşleştirme sırası önemli değil, bu yüzden

sadece kelimeler. Ve muhtemelen

 69 | 1 
    1 | 72 
    69 | 1 

 69 | 1 
    1 | 72 
    1 | 69 

ait tüm Bunu sağlamak için veritabanını yapılandırmak için en iyi yolu merak ediyorum gibi yinelenen herhangi bir sırayla kayıtlarını, bu nedenle bir şey istemiyoruz. Ne (röportajında) önerdi benim T-SQL sözdiziminde herhangi bir hata

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 
  • gibi, tüm bu kontrol eden bir sproc aracılığıyla synynoms var mıdır takmadan mı?
  • Tek yol eşanlamlılarının eklendiğini varsayarsak, bu yordam mantığa göre tüm vakaları kapsar ve Synonyms tablonun boyutunu patlatmaktan korur mu?
  • Bu eşanlamlı deseni tasarlamak için daha iyi bir yol var mı?
  • Bu arada, T-SQL'de bir XOR takası yapmak mümkün mü?
+0

W Hala röportaj yapıyorsanız işaret etmek için karınca, muhtemelen eşanlamlı tablo şemasına bir çeşit sayısal "rank" sütunu eklemek isteyebilirsiniz; Bir eşanlamlıya baktığınız zaman düşünün, belirli bir sözcüğün eşanlamlıları genellikle anlamlarının sizin sözünüze ne kadar benzediğine göre sıralanır. Bu aynı zamanda çift yönlü harita optimizasyonunuzu da çalışmaz hale getirir, gereksiz bir optimizasyon söz konusudur. –

cevap

1

Gördüğüm bir hata var, ancak sözdiziminde değil, mantıksal. IF NOT EXISTS, wordA_Id ve wordB_Id numaralı makalelerde yer almalıdır.
Ayrıca, veritabanının açıklamasından net değil, ancak sözcük tablosundaki sözcüklerin, benzersiz bir dizinin yanı sıra Eş Anlamlılar tablosundaki iki sütunun birleşimi olması gerekir.

Daha iyi bir veritabanı tasarımının mevcut olup olmadığından emin değilim, ancak başka bir seçenek var ve kelimeler tablosunda bir öz referans kullanıyor. Bununla birlikte, bu, öz referans sütununun null olması ve tüm büyük veritabanları tarafından mükemmel şekilde desteklenirken, frowned upon.
xor takas ilgili sorunuza için - bu t-sql mümkündür:

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 

sonuçları:

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


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

Belki SynonymId referans adlı Kelime masaya yeni bir alan ekleyebilirsiniz yeni tablo Eş anlamlılar

Bu Eş Anlamlılar Sözlüğünde eşanlamlıını bulunamıyor (benzersiz olmayan), WordId Bir kelimenin eş anlamlı listesini almak istediğinizde

Yani, bu satırın aynı SynonymId eş listeyi nasıl seçmek için bir İşte WordId

üzerinde

Words katılmadan ile

Sorgu eşanlamlılar alan SynonymId okumak tablo yapısı ve örnek veri ile sorgulanabilir

Burada
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 temsil eş

İlgili konular