在同一张桌子上做多对多关系的最佳方式

时间:2013-12-02 11:22:27

标签: sql-server

我想在我的应用程序中实现一个新功能,以便将文件与其他文件(多对多关系)链接起来。我认为最好的解决方案是创建一个" RelationTable"包含重复的fileId对。我的意思是:

RelationTable

FileX FileY

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

查看链接到" File2"的所有文件我会提出这个问题:

select * from RelationTable
where FileX = file2

我的问题是,这是最好的解决方案吗?有没有其他方法可以改善它?

提前致谢

2 个答案:

答案 0 :(得分: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);

<强>更新

当您使用SQL Server时,您可以使用尾随空白来运行边缘情况,这些空白在插入时被修剪但在文件名中可能有意义。

更新2:

如果您的映射始终是双向的,请不要创建第二个索引(在fileY上),这是多余的。

答案 1 :(得分:0)

另一种方法是使用CASE,然后您不需要为每个双重关系建立两行:

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