我希望确定从性能和编码角度来看,将两个关联的数据库记录存储为单行是否更好(并且为特定记录搜索两列,因为值可能位于任一位置)或创建该关联的第二行,仅搜索一列。
一个例子有望帮助:
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
谢谢!
答案 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]永远是该对中的第一个。如果两列都有索引,那么它也应该非常高效。