将值存储在单独的表中是否有任何显着优势?

时间:2016-05-18 20:24:16

标签: sql-server

我们有一个Item表。每排超过25万行,超过200个字段。我们需要添加另一个字段。我创建了一个表并将其与guid链接。

ALTER TABLE Item
    ADD RI_BusinessPotential identifier null

然后添加一个字段来链接主表

<xsl:key name="k1" match="linkedIds/linkedId" use="idOfElement"/>

<xsl:key name="k2" match="effect" use="idEffect"/>

执行该报告的人想要消除该表,因为他不喜欢guid并将值直接存储在表中。桌子很小我想知道他是不对的。但是表格太小了我不认为它会通过额外的连接来影响SQL。

处理此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

最好的方法是首先考虑在业务需求,用户体验和数据完整性方面将BusinessPotential的值直接存储在项目表中的含义。此外,通过连接显示性能影响(如果有)是否显着以及缺点是否超过拥有额外表的优点的测试。你的报告人有他自己的理由,你应该检查他的理由是否有效,以及新设计是否优越或至少是最好的妥协。

业务需求的一个示例是编辑/更新列值。如果用户可以在item表的某种维护GUI中编辑此列,您如何知道用户输入是否正确?有哪种机制可以检测或防止不需要的价值?系统是否会为用户提供可供选择的下拉列表?如何创建下拉菜单?外键约束似乎是一种更简单和更健壮的设计,更不用说数据输入会更容易,也不容易出错。

我可以问你为什么选择uniqueidentifier作为代理密钥吗?正如Matthew所建议的那样,INT代理键而不是uniqueidentifier是一个选项并且会使行保持较小,但在这种情况下code就足够了。

现在,在测试性能之前,我建议先清理一下表格。让我们摆脱RecordID。将Code列重命名为BusinessPotentialCode,将其添加到item表的副本,然后创建外键约束。请记住支持与索引的连接,这是获得最佳性能的关键。

对于使用varchar(100)或Char(1)的连接中的性能差异,我怀疑在您的情况下存在显着差异,假设索引正确支持连接。但是,你不要认为像

这样的谓词

BusinessPotentialCode IN ('A','B','C')

似乎比

更好

BusinessPotentialDesc IN ('Maintain substantial inventory','Maintain minimum inventory','Tooling required to order')

潜在陷阱的一个简单示例是连接列值中的单引号。这可以使上述谓词非常混乱,非常快。

最后,BusinessPotential似乎与需求或销售业绩非常相关,这意味着我希望它能够定期更新。假设BusinessPotential的平均大小为30个字节,让我们考虑2个具有2个伪代码的场景。

UPDATE SET Value_Old(char(30)) = Value_New(char(30))

UPDATE SET Value_old(char(1)) = Value_New(char(1))

我想你知道哪一个可能跑得更快。

答案 1 :(得分:1)

这实际上是一个很好的设计实践(它是规范化的一部分),除非你一次性返回所有行,否则你几乎肯定不会看到任何性能影响。有许多优点,覆盖它们都是SO的一点点,但我每天作为程序员看到的最大的一个是,当你创建一个界面来更新这些信息时,你现在可以列出每个选项,而不是必须键入它。列表确保每个函数的一致性,而不是人们输入内容时可能发生的描述差异。它还允许您提取项目具有特定RI_BusinessPotential的记录。

编辑:我错过了使用GUI的地方。我建议不要使用INT的自动递增PK,以获得更好的性能并更容易编写查询。