【问题标题】:Storing array of integer values in SQL Server在 SQL Server 中存储整数值数组
【发布时间】:2010-10-27 12:11:09
【问题描述】:

我想在 SQL 数据库表 (SQLServer 2005) 中存储一个整数值数组,如果可能的话,使用单列。

整数数组的长度为 7560 个值。

我使用的是objectdatasource,数据类型应该与tableadapter的生成参数兼容。

感谢您的帮助:)

【问题讨论】:

  • 为什么不创建一个大文本字段并用逗号分隔值?或使用 blob 作为位图(每个 int 4 个字节),或者创建一个包含 7561 个字段的表:P

标签: c# sql sql-server-2005 objectdatasource


【解决方案1】:

你至少有两个选择:

  • 将其存储为逗号分隔的值列表。
  • 使用单独的表,每行存储一个值,外键指向您的表。

如果你想规范你的数据库,你应该选择第二个选项。

【讨论】:

  • 感谢您的回答!如果我对数据库进行规范化,我最终会得到数百万行(可能超过 5000 万行)。我不确定数据库是否可以在没有性能问题的情况下处理它。
  • @spoekes:我认为您需要考虑您的用例来决定哪种解决方案最适合您。您是否总是需要一次获取和修改整个列表?然后使用单个单元格可能没问题。有时您是否会对只更改一个元素或检查一个元素是否在列表中感兴趣?那么标准化很可能会给你带来更好的性能。
  • 我需要快速保存数据,然后加载整数集并用它绘制图表。无需修改任何这些值。
  • 经过一些测试后,我选择了选项 1。感谢您的帮助!
【解决方案2】:

做对:1NF 规定没有重复值。您建议的 7560 元素数组中的每个元素都属于自己的行。

通过将每个元素放在自己的行中,您可以让 RDBMS 有机会做其他方式无法做的事情,例如:计算集合的统计信息,验证每个元素是否符合域规则,计算两个集合之间的差异,计数/选择集共享一些特征。

我最终会得到数百万行(可能超过 5000 万行)。我不确定数据库是否可以在没有性能问题的情况下处理它。

这并不是特别多,而且大多数时候您不需要处理全部 5000 万。自己计算一下搜索二叉树需要多少次访问才能找到十亿分之一的记录。答案可能会让你大吃一惊。

【讨论】:

  • 没有必要实现一切。我相信,对于标记,您应该首先存储为数组,然后出于性能和报告目的,创建另一个表以方便实现。这可能正是有些人选择 mongoDB 的原因。但实际上这是因为人们说你不应该这样做或导致它恕我直言。
【解决方案3】:

仅当您必须这样做时!您可以轻松创建另一个表,其中包含返回到您的表的外键和一个 int 列。

如果您坚持将其作为列保存在 SQL Server 中,则必须使用 IMAGE 列类型或 VARBINARY(MAX),因为您的数据长度超过 8K。这会将每个 int 存储为一个 4 字节的二进制值。

什么是 ObjectDataSource?

【讨论】:

  • 感谢您的回答!使用 VARBINARY(MAX) 或 IMAGE 有什么缺点吗? ObjectDataSource 是数据访问层,它生成检索数据的方法。
  • VARBINARY(MAX) 或 IMAGE 字段的性能不是很好,虽然足够好。
【解决方案4】:

如果数据与任何其他表不相关(例如,您想以某种方式处理的值),我会将其存储在逗号分隔值中,如果它们是(例如账单中的产品),您应该创建另一个带有外键的表。

大功告成

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多