【问题标题】:Storing a Dictionary<string, string> in the database在数据库中存储 Dictionary<string, string>
【发布时间】:2014-01-11 03:22:36
【问题描述】:

在我的代码中的某个时刻,我正在创建一个 Dictionary&lt;string, string&gt; 类型的字典,我想知道在将其转换为字符串然后返回字典方面,将其存储在数据库中的最佳方法是什么.

谢谢。

【问题讨论】:

  • 为什么你不想做两列——一列是键,一列是值?
  • @evilone:因为每个用户都有自己的字典:我需要一列用户ID,一列字典字符串
  • 好吧,为什么不使用三列,一列UserID,一列DictionaryKey,一列DictionaryValue,并且表的主键是UserID的复合键和DictionaryKey.
  • 为什么不用三列——一列用于userId,一列用于key,另一列用于value
  • @PeterMajeed:当我需要添加 1000 个字典时该怎么办?

标签: c#


【解决方案1】:

这里有很多选项。

  • 您可以走规范化路线并使用带有键/值对列的单独表。

  • 某些数据库为您提供与您需要的数据类型相似的数据类型。 PostgreSQL 有一个hstore 类型,您可以在其中保存任何键值对,MS SQL 有一个 XML 数据类型,它也可以用于在插入之前对数据进行一些简单的按摩。

  • 如果没有这种特定于数据库的帮助,您可以只使用 TEXT 或 BLOB 列并使用 DB 友好格式(例如 JSON、XML 或特定语言的序列化格式)序列化您的字典。

权衡如下:

  • 具有键/值列的单独表会导致查询成本高昂,并且通常是 PITA,但您可以获得最大的查询灵活性并且可以跨数据库移植。
  • 如果您使用数据库驱动的字典类型,您将获得查询支持(即“选择存储在字典中的属性与特定条件匹配的行”)。没有它,您只能在程序中选择所有内容并进行过滤,但是
  • 除非您编写一个将其抽象出来的中间层,否则您将失去数据库可移植性,并且您将失去代码中数据操作的便利性(因为事情“工作”就好像您的数据库中有一个包含这些数据的列一样)。李>

document oriented”的 NoSQL 数据库正好适用于这种类型的存储。根据您在做什么,您可能需要查看一些选项。 MongoDB 是一个受欢迎的选择。

正确的选择取决于数据的查询模式和其他非功能性问题,例如数据库支持等。如果您扩展您需要实现的功能,我可以扩展我的答案。

【讨论】:

  • 好的,感谢有关 MongoDB 存储类型的建议。最终我的应用程序将托管在 Azure 中,它也有一个键/值数据存储,稍后我会将应用程序更改为这个存储。
  • 我会非常警惕特定于平台的 KV 存储,但这只是我 :)
【解决方案2】:

如果您真的想将完整的字典存储为单个字符串,那么您可以将字典序列化为 JSON(或 XML)并将结果存储到数据库中。

【讨论】:

  • 好的,那我就搞定Json路由吧。
【解决方案3】:

这里有几个选项。您可以将对象序列化为 XML 或 @M4N 提到的 JSON。您还可以创建一个至少包含两列的表:一列用于键,一列用于值。

这实际上取决于您的域模型是什么样的以及您需要如何管理数据。如果字典值或键发生变化(IE 重命名、更正等),并且需要反映在依赖于数据的许多对象中,那么为直接映射到字典创建一种查找表可能是最好的。否则,序列化数据将是性能最佳的选项之一。

【讨论】:

  • 这行不通:每个用户都有自己的 dico,所以我不能在添加字典时添加列。
  • 好的。只是想我会把它扔在那里:) 听起来像序列化是要走的路。 JSON 的性能会比 XML 好一点。如果您使用的是 MS SQL,并且必须查询(通过 SQL)字典中的值,那么 XML 可能会更好,因为 T-SQL 支持查询 XML,但不支持查询 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2012-09-21
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多