Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL效率参数,添加列还是可通过查询解决?_Sql_Sql Server_Database Design - Fatal编程技术网

SQL效率参数,添加列还是可通过查询解决?

SQL效率参数,添加列还是可通过查询解决?,sql,sql-server,database-design,Sql,Sql Server,Database Design,我刚大学毕业,是软件开发的新员工。最近事情有点慢,所以给了我一个db任务。我的数据库技能仅限于使用Rails和Django的pet项目。所以,我对我最近的任务有点惊讶 我的经理要求我用“父”表对Person进行子分类,并在Person表中添加对其保管人的引用。当托管人(而非家长)是FormContact时,这有助于从家长到表单的转换 下面是我正在使用的sql db的简化模拟结构。如果我有权访问Visio,我会绘制关系表 我们有一个表“Person”和一个表“Form”。有一个表“FormCont

我刚大学毕业,是软件开发的新员工。最近事情有点慢,所以给了我一个db任务。我的数据库技能仅限于使用Rails和Django的pet项目。所以,我对我最近的任务有点惊讶

我的经理要求我用“父”表对Person进行子分类,并在Person表中添加对其保管人的引用。当托管人(而非家长)是FormContact时,这有助于从家长到表单的转换

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

我们有一个表“Person”和一个表“Form”。有一个表“FormContact”,它将一个人与一个表单关联,但并非所有人都与一个表单关联。有一个人际关系表(雇主、父母等)

我问,“为什么不能通过查询来处理这个问题?”回答很低效。(真的!?!)

因此,我问,“为什么不引用表单?这样会更有效,因为您不会使用来自孩子/监护人的引用来查询FormContacts表。”回答,这基本上会使家长成为FormContact。(很公平。)

我编写了一个查询,从非FormContact父级到窗体,并在生产服务器上进行了测试。响应时间是瞬时的。SOME_值是父对象的fk ID

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

如果我是对的,“这是一个不必要的改变。”我应该怎么做,捍卫我的立场,还是应该向经理们的要求让步


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

首先,您的查询可能需要一些修改。尝试使用
连接,而不是子选择:

SELECT FormID

FROM FormContact fc

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

WHERE cr.RelatedContactID = @parent_id
其次,您要处理的问题是规范化与性能。从纯度的角度来看,是的,您的解决方案是“更正确的”(因为您没有复制数据,这消除了复制数据中的差异导致冲突和异常行为的可能性),但纯标准化并不总是最明智的做法

规范化可能导致性能下降,尤其是在较大的数据集中。这些处罚必须与正常化带来的好处一起权衡,以确定哪一方“获胜”

话虽如此,我看不出再次加入
ParentID
列上的
Person
表(我假设您将添加该表)将如何比上面列出的联接提供性能提升,假设相关列已正确索引


如果上述查询对您有效,并且您进行了严格的性能测试以证明其有效性,请将其提交给您的经理并征求他的意见。因为你是刚从大学毕业的新人,所以在这件事上要非常愿意听从你经理的判断和愿望。未来会有更大的战斗要打。

你到底在问什么?你反对系统的哪一方面?我不明白SQL查询是如何低效的。尤其是像这样简单的。另外,我不知道创建子类和列(这将导致另一个SQL查询)如何更有效。两个查询之间的唯一区别是一个使用子查询,另一个使用fk id。您可以发布经理建议的查询/解决方案吗?我可能会建议加入,而不是内部的select声明。这里有一些关于大学刚毕业的新员工的建议。虽然你的解决方案可能会更好,但要注意如何与你的经理接洽。我发现有些经理非常自负(出于某种原因,这在这个领域很普遍),如果你拍他的脸说你的想法更好,即使是这样,他也可能不欣赏。你可以发布当前的表DDL和建议的表DDL吗?我喜欢这个答案。我可以使SQL查询适应实际的数据库和规范化的解释。性能信息丰富。此外,它还解决了经理问题。谢谢