我有一个例程将创建单独的表 (Sql Server 2008) 来存储我的应用程序 (Asp.net 3.5) 生成的报告结果。每个报告都需要自己的表格,因为表格的列会因报告设置而异。一个表将包含 10-5,000 行,很少超过 10,000。
以下使用规则将适用:
- 一旦存储,数据将永远不会更新。
- 每当访问表的结果时,将检索所有数据。
- 不需要其他表与该表执行连接。
知道了这些,还有什么理由要在表上创建PK索引列吗?这样做是否有助于以任何方式检索数据的性能,如果可以的话,这是否会超过插入数据时更新索引的额外负载(我知道 10K 条记录是一个相对较小的数量,但此解决方案需要能够扩展)。
更新:以下是有关正在处理的数据的更多详细信息,这些信息涉及每个报告一个表的当前设计决策:
- 表将记录一组数值(根据报表设置在运行时设置),这些数值对应于一组不同的引用 varchar 值(也根据报表设置在运行时设置)。
- 无论何时检索数据,都需要在服务器上进行一些后处理,然后才能将输出显示给用户(因此我将始终检索所有值)。
我也怀疑有人声称他们必须为每次运行报告时创建一个新表。然而,考虑到每次运行报告时都可能需要不同的列(包括数字、名称和数据类型),我看不出有什么好的选择。
我唯一能想到的是有一个 ID 列(标识 ReportVersionID,对应另一个表),ReferenceValues 列(varchar 字段,包含所有引用值,按指定顺序,用一些分隔符分隔)和NumericValues 列(与 ReferenceValues 相同,但用于数字),然后当我检索结果时,将所有内容放入系统中的专用对象中,根据定义的分隔符分隔值)。这看起来更可取吗?
最佳答案
对于任何和所有数据表,主键都不是必须的。诚然,它们通常非常有用,放弃它们是不明智的。 但是,除了主要的速度任务(我同意这无疑会受到积极影响)之外,还有独特性。为此,考虑到您显然已经考虑的因素,我建议唯一需要主键的是管理表的预期唯一性。
更新: 您在评论中提到,如果您执行 PK,它将包含一个目前不存在且不需要的身份列。在这种情况下,我会完全反对 PK。正如@RedFilter 指出的那样,代理键永远不会增加任何值(value)。
关于sql-server - 是否有永远不会使用的主键列的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3959780/