2013-12-02 4 views
1

Я хочу реализовать новую функцию в своем приложении, чтобы связать файл с другими файлами (отношение многих к большому числу). Я думал, что лучшим решением является создание «RelationTable», содержащее пары duplicate fileId. Я имею в виду:Лучший способ сделать отношение многих ко многим в одной таблице

RelationTable

FileX FileY 

file1 file2 
file2 file1 
file3 file4 
file4 file3 
file5 file2 
file2 file5 

Чтобы увидеть все файлы, связанные с "File2" Я хотел бы сделать этот запрос:

select * from RelationTable 
where FileX = file2 

Мой вопрос, это лучшее решение? есть ли другие способы его улучшить?

Заранее спасибо

+0

Может ли файл 'file2' ссылаться на многие файлы? – Quassnoi

+0

Привет! Благодарю за ваш ответ. Да, файл2 может быть связан с другими файлами – Docu

+0

Какие СУБД вы используете? – Quassnoi

ответ

2

Конечно, вы можете использовать ваше решение, только индекс таблицы правильно:

CREATE UNIQUE CLUSTERED INDEX -- or ALTER TABLE ADD PRIMARY KEY CLUSTERED 
     ux_relationTable_X_Y 
ON  relationTable (fileX, fileY); 

CREATE INDEX 
     ix_relationTable_Y 
ON  relationTable (fileY); 

Update:

Как вы используете SQL Server, вы можете запустить accross крайние случаи с завершающими пробелами, которые обрезаются на вставке, но могут иметь смысл в именах файлов.

Update 2:

Если ваши отображения всегда двунаправленные, не создает второй индекса (на fileY), это излишний.

+0

Большое спасибо. Да, конечно. Эта новая таблица будет содержать большое количество строк. Именно по этой причине я подумал, что это лучшее решение. – Docu

+0

RelationTable будет содержать идентификатор файла;) – Docu

0

Альтернативой использует CASE и тогда вам не нужно иметь две строки для каждого biderectionnal отношений:

select file2 as X, 
     (CASE WHEN fileX = file2 
      THEN fileY 
      ELSE fileX 
     END) as Y 
from RelationTable 
where (fileX=file2 or fileY=file2); 

, чтобы извлечь все файлы, относящиеся к file2

На столе, как этот

fileX fileY 
-------------- 
file2  file1 
file3  file2 

результат будет

X  Y 
--------------- 
file2 file1 
file2 file3 
+0

Благодарим за отзыв. Я сделаю это ;) – Docu

Смежные вопросы