【问题标题】:How to assign an id to a group SQL Server如何将 id 分配给组 SQL Server
【发布时间】:2012-05-05 00:02:40
【问题描述】:

我正在运行一个计划任务,它每晚在设定的时间检查属性的值。我的计划是根据返回的值构建一个前端。

目前,由于要返回的数据量如此之大,我每晚要在数据库中返回 800 多行。

其中一列是查询运行的日期——令我震惊的是,这是多余的,因为对于每组属性(即每晚运行计划任务),这个 dateTime 值将是相同的。

从我的数据库中删除此冗余/重复日期的最佳方法是什么?

目前我有以下标题:

Id -- Name -- AttributeIMeasure -- dateRan

感谢您的帮助!

【问题讨论】:

  • 你对查询返回的数据做了什么?您是将其存储回数据库、将其写入文件还是执行类似操作?
  • 查询返回的数据构成了存储在 Name 和 AttributeIMeasure 中的数据。所以我将它从一个数据库复制到另一个数据库(我从中复制的数据库是动态的,我希望随着时间的推移对其进行跟踪)。

标签: sql sql-server database database-design schema


【解决方案1】:

我很想创建一个单独的表 RunInformation,其中包含一个主键列 Id 和一个 RunDate 列:

Id -- RunDate

然后,您可以将表中的 dateRan 列替换为对 RunInformation 表的引用。如果需要,这将允许您存储有关运行的其他信息。

Id -- Name -- AttributeIMeasure -- RunInformationId

【讨论】:

  • 我明白了,但这不会减少存储的冗余数据,对吗?因为,在给定的一天,我的查询的每次运行都会返回一个包含 Name 和 AttributeIMeasure 的行列表,但是对于返回的所有行,RunDate 将是相同的! :)
  • 啊,我明白你的意思了。这将减少任何冗余。我应该向 RunInformation 表添加什么样的参考?
  • 您应该在现有表中添加“RunInformationId”作为外键。
  • 如果问题是为了节省空间,请注意不要使用 INT 作为 ID。这与 SMALLDATETIME 的空间量相同。您不得不为 RunID 使用 SMALLINT 或 TINYINT 以节省空间,即使这样它也会变得微不足道。
【解决方案2】:

我不会删除这种冗余。

你能确定你永远不会只更新一个组的部分吗?
- 某种失败或错误?
- 未来要求的变化?

另外,冗余的真正缺点是什么?您要解决什么实际问题


如果您确实真的需要这样做,那么您只需要一种将属性映射到组的方法。

创建attribute_groups 表(至少包含id 和dateRan 字段),并在原始表中添加attributeGroupID 字段。


但我仍然不明白在这种情况下增加架构复杂性、获取 DateRan 值所需的额外连接以及增加约束是值得的。

【讨论】:

  • 感谢您的回复。我希望根据我存储在数据库中的值构建一个前端。在接下来的几年里,它将每晚运行一次,每晚返回约 800 个结果。需要所有这些数据,日期时间除外。我在这种性质的大规模编程方面经验很少,但我假设,在存储所有数据的情况下,如果可能的话,如果我可以从每条数据中删除一列,这将是很重要的 :)
  • 我会提醒您不要担心这样的存储。如此小规模的空间和效率可能不值得关注。除非您将其扩展到数百万条记录,否则空间差异将可以忽略不计。
  • 非常感谢您的建议,这对了解很有帮助:)。
  • @SimonKiely - 此外,您不会节省太多空间。每条记录都需要新的 attributeGroupID 字段,然后您就有了新表的空间。 SMALLDATETIME 本身只有 4 个字节,与 INT 相同。您只会为 groupID 使用 SMALLINT 来节省空间,即便如此,它也只是很小的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多