我们有一个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。
处理此问题的最佳方法是什么?
答案 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,以获得更好的性能并更容易编写查询。