2010-03-29 69 views
0

我是最近的大学毕业生,也是软件开发的新雇员。事情最近有点慢,所以我得到了一个数据库任务。我的db技能仅限于使用Rails和Django的宠物项目。所以,我对我最近的任务感到有点惊讶。SQL效率参数,添加一列或通过查询解决?

我的经理已要求我为Person创建一个'Parent'表,并在Person表中添加对其管理员的引用。当托管人(不是父母)是FormContact时,这是为了方便从父母到母亲。

这是我正在使用的sql-db的简化模拟结构。如果我有权访问Visio,我会绘制关系表。

我们有一张桌子'人',我们有一个'表'的表。有一个表格'FormContact',它将一个人与一个表格联系起来,并不是所有的人都与一个表格有关。有人际关系关系表(雇主,家长等)

我问过,“为什么不能通过查询处理?”回应,效率低下。 (真的!?!)

所以,我问,“为什么不引用表单?这样会更有效率,因为您不会使用child/custodian引用查询FormContacts表。回应,这基本上会使Parent成为FormContact。 (足够公平)

我继续写了一个查询,从非FormContact Parent获取到Form,并在生产服务器上进行了测试。响应时间是即时的。 SOME_VALUE是Parent的fk ID。

SELECT FormID 
FROM FormContact 
WHERE FormContact.ContactID 
    IN (SELECT SourceContactID 
     FROM ContactRelationship 
     WHERE (ContactRelationship.RelatedContactID = *SOME_VALUE*) 
      AND (ContactRelationship.Relationship = 'Parent')); 

如果我是正确的, “这是一个不必要的变化。”我应该怎么做,捍卫我的立场,还是应该向经理人提出要求?

如果我错了。我的错误是什么?有没有比经理更好的解决方案?

+0

你到底在问什么?您反对系统的哪一方面? – 2010-03-29 14:07:20

+0

我不明白SQL查询如何低效​​。尤其像这样简单。另外,我没有看到如何创建子类和列,这会导致另一个SQL查询更高效。两个查询之间的唯一区别是一个使用子查询,另一个使用fk ID。 – sanscore 2010-03-29 14:13:49

+0

您的查询适用于给定的SOME_VALUE,请编写一个查询以处理来自FormContact的所有行,就像报表一样。 – 2010-03-29 14:14:26

回答

2

首先,您的查询可能会使用一些返工。而不是子查询,请尝试使用join

SELECT FormID 

FROM FormContact fc 

JOIN ContactRelationship cr on cr.SourceContactID = fc.ContactID 
           and cr.Relationship = 'Parent' 

WHERE cr.RelatedContactID = @parent_id 

其次,你要处理的问题是标准化与性能。从纯粹的角度来看,是的,你的解决方案“更加正确”(因为你没有复制数据,这消除了重复数据中的差异导致冲突和异常行为的可能性),但纯正常化并不总是最明智的过程的行动。

规范化会导致性能损失,尤其是在较大的数据集中。这些惩罚必须与正常化的好处一起衡量,以查看哪一方“获胜”。

这就是说,我不明白如何再加入PersonParentID列(我假设这是你将添加)将提供一个性能提升超过上面列出的连接,假设有问题的列正确编入索引。

如果上面的查询适用于您,并且您进行了严格的性能测试以证明其有效性,请将其交给您的经理并要求他的输入。因为你是大学新生的新人,非常愿意听从你的经理的判断,并且希望能够在这一天发表意见。未来将会有更大的战斗。

+0

我喜欢这个答案。我可以将SQL查询调整为实际的数据库,并且规范化与性能的解释是有益的。此外,它解决了经理问题。谢谢。 – sanscore 2010-03-29 16:02:43