sql-server - 是否有永远不会使用的主键列的原因?

标签 sql-server database database-design indexing primary-key

我有一个例程将创建单独的表 (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/

相关文章:

sql - 为什么我要费心使用全文搜索?

SQL从两个时间段中选择最大值

c# - 如何在数据库中存储带有数组的 C# 对象?

sql-server - 为什么 SELECT FROM sys.dm_db_index_usage_stats 返回两行/表?

sql-server - 如果表设计发生变化,确定存储过程中的错误

java - 如何在java中存储有变音符号的字符串

mysql - 错误 : column specified more than once in Postgres

java - 如何查看/监控数据库池中的实时数据库连接?

database - 使用继承在 Postgres 中反反模式 (OTLT)

mysql - 如何有效地存储这种语言设置数据?