存储和查询双向关系的数据库性能

时间:2014-01-29 14:57:31

标签: sql database relational-database foreign-key-relationship database-performance

我希望确定从性能和编码角度来看,将两个关联的数据库记录存储为单行是否更好(并且为特定记录搜索两列,因为值可能位于任一位置)或创建该关联的第二行,仅搜索一列。

一个例子有望帮助:

UserTable
userID    INTEGER, 
firstName VARCHAR2(20),
lastName  VARCHAR2(20)

2行:

1, John, Smith
2, Terry, Jenkins

第二个表(跟踪两者之间的关系)

RelationshipTable
relationshipID INTEGER,
userID1        INTEGER,
userID2        INTEGER

现在要存储john和terry之间的关系,我可以这样做:

选项1(1行):

relationshipID, userID1, userID2
1,              1,       2 

然后寻找特里是我的一部分的任何关系,我必须做类似

的事情
SELECT *
FROM RelationshipTable
WHERE userID1 = [terrysID] OR userID2 = [terrysID]

或者我可以使用2行并将关联中的每个ID插入特定列。

Option2(2行):

relationshipID, userID1, userID2
1,              1,       2
2,              2,       1

找到terry属于的任何关系:

SELECT *
FROM RelationshipTable
WHERE userID1 = [terrysID]

我不确定哪个更好。

我可以在两列上设置索引,这有助于第一个选项。但是,我仍然需要在处理后进行一些结果,以确定结果集中的哪个列具有不是特里的ID。我认为编码有点麻烦,因为我必须在多个地方重复这个逻辑。

另一方面,第二种方法有效地使数据量翻倍,甚至更可怕,重复数据而不增加任何真正的“商业价值”。因此,如果这种关系结束了,我必须确保删除了两个记录(或软删除或我们选择做的任何事情)。

我从来不知道我是否会搜索John的关系或者Terry的关系,因此我无法在创建关系时智能地将ID插入特定列。

思考?我可能还有第三种选择没有想到哪种更好?像在表上创建一个视图,创建两行进行查询但没有实际复制数据?显然,这会在系统上产生额外的开销。

编辑: 这看起来像一个类似的问题,但我不确定任何答案是否能准确满足我的要求。 Two way relationships in SQL queries

谢谢!

1 个答案:

答案 0 :(得分:1)

在清晰度和易用性方面,我选择了选项1.这样做的缺点是错误允许1与2相关,2也与1相关,这将是多余的。但是,这将取决于前端停止(你不能在数据库中做所有事情)。

通过不使用您提供的简单选择,可以完全避免您的后处理,但使用此方法:

SELECT relationshipId, user1Id, user2Id
FROM RelationshipTable
WHERE userID1 = [terrysID] 
union all
SELECT relationshipId, user2Id, user1Id
from RelationshipTable
where userID2 = [terrysID]

这意味着[terrysId]永远是该对中的第一个。如果两列都有索引,那么它也应该非常高效。