【问题标题】:Storing a Dictionary<int,string> or KeyValuePair in a database在数据库中存储 Dictionary<int,string> 或 KeyValuePair
【发布时间】:2014-11-14 03:24:01
【问题描述】:

我想看看其他人在使用 List 或 Dictionary 等类型并依次存储和检索这些数据时的经历?

这是一个示例场景:用户将创建自己的“模板”,这些模板本质上是字典的集合,例如对于 user1,值是 (1, Account), (2, Bank), (3, Code), (4, Savings),对于 user2,值(不相关)可以是 (1, Name), (2, Grade) , (3, Class) 等等。这些模板/列表可能有不同的长度,但它们总是有一个索引和一个值。此外,每个列表/模板将有一个且只有一个用户链接到它。

你在数据库端选择了哪些类型?

还有我应该注意的痛点和/或建议?

【问题讨论】:

  • 您的意思是除了 List 不是有效的 C# 语法这一事实之外的痛点?
  • ListDictionary 是许多 C# 开发人员日常使用的极其常见的类型。如果没有您的具体问题,就不可能对您的问题做出良好的回答。
  • 这个问题有一些不错的答案是适用的...stackoverflow.com/questions/21052318/…
  • 我不在 SQL 中存储 .NET 对象。我存储填充自定义对象所需的数据,然后在必要时将它们添加到 .NET 集合中。
  • 我已经添加了一个示例场景,谢谢大家!

标签: c# sql-server linq oop


【解决方案1】:

就集合中的类型而言,.Net 类型和 SQL 类型之间存在相当一对一的映射:SQL Server Data Type Mappings。您主要需要担心字符串字段:

  • 它们是否总是 ASCII 值 (0 - 255)?然后使用VARCHAR。如果它们可能包含非 ASCII / UCS-2 字符,请使用 NVARCHAR
  • 它们可能的最大长度是多少?

当然,有时您可能希望在数据库中使用稍微不同的数字类型。主要原因是如果在应用程序端选择了int,因为它比Int16byte 处理起来“更容易”(或者我被告知),但值永远不会超过32,767 或255,那么您很可能应该分别使用SMALLINTTINYINTintbyte 在应用层内存方面的差异可能很小,但它确实对物理存储有影响,尤其是当行数增加时。如果不清楚,“影响”意味着减慢查询速度,有时当您需要购买更多 SAN 空间时会花费更多钱。但是,我说“最有可能使用SMALLINTTINYINT”的原因是因为如果您有企业版并启用了行压缩或页面压缩,那么这些值将存储在它们将适合的最小数据类型。

就从数据库中检索数据而言,这只是一个简单的SELECT

就存储这些数据而言(至少在有效地执行数据方面),嗯,这更有趣:)。将字段列表传输到 SQL Server 的一种好方法是使用表值参数 (TVP)。这些是在 SQL Server 2008 中引入的。我在这个答案中发布了一个代码示例(C# 和 T-SQL),这里有一个非常相似的问题:Pass Dictionary<string,int> to Stored Procedure T-SQL。关于该问题还有另一个 TVP 示例(已接受的答案),但它没有使用 IEnumerable&lt;SqlDataRecord&gt;,而是使用了一个不必要的集合副本 DataTable

编辑: 关于指定要持久化的实际数据的问题的最新更新,应将其存储在类似于以下内容的表中:

UserID INT NOT NULL,
TemplateIndex INT NOT NULL,
TemplateValue VARCHAR(100) NOT NULL

PRIMARY KEY 应该是 (UserID, TemplateIndex),因为这是唯一的组合。不需要(至少在给定信息的情况下)不需要 IDENTITY 字段。

TemplateIndexTemplateValue 字段将在 TVP 中传递,如我对上面链接的问题的回答所示。 UserID 将作为第二个SqlParameter 自行发送。在存储过程中,你会做类似的事情:

INSERT INTO SchemaName.TableName (UserID, TemplateIndex, TemplateName)
    SELECT  @UserID,
            tmp.TemplateIndex,
            tmp.TemplateName
    FROM    @ImportTable tmp;

并且只是明确说明,除非有一个 非常 这样做的特定原因(这需要包括从不,永远需要在任何查询中使用此数据,以便此数据实际上只是一个文档,在查询中不比 PDF 或图像更有用),那么您不应该将其序列化为任何格式。尽管如果您愿意这样做,XML 是比 JSON 更好的选择,至少对于 SQL Server 来说是这样,因为 SQL Server 中内置了与 XML 数据交互的支持,但对于 JSON 则没有那么多。

【讨论】:

  • 天哪,我刚刚看了你对“通过字典...”的回答,它确实看起来应该对我有帮助!我会报告的,谢谢!
  • @frenu :我刚刚更新了关于您的问题更新中提供的新详细信息的答案,包括我的链接答案的一些差异,由于 UserID 属性/字段,此处仅略有不同.
  • 让我慢慢吸收这些重要信息,我会回来报告的。谢谢!
【解决方案2】:

数据库中的列表或任何集合的表示应该是表。始终将其视为一个集合,并将其与数据库提供的内容相关联。

虽然你总是可以序列化一个集合,但我不建议这样做,因为更新或插入记录,你总是更新整个记录或数据,而有一个表,你只需要查询 KEY 其中字典,你已经有了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多