C# 存储字典<;字符串,字符串>;在数据库中

C# 存储字典<;字符串,字符串>;在数据库中,c#,C#,在我的代码中的某个时刻,我正在创建一个类型为dictionary的字典,我想知道将它存储在数据库中的最佳方法是将其转换为字符串,然后再返回到字典 谢谢。如果您真的想将完整字典存储为单个字符串,那么您可以将字典序列化为JSON(或XML)并将结果存储到数据库。这里有一些选项。您可以将对象序列化为XML或JSON,如@M4N所述。您还可以创建一个至少包含两列的表:一列用于键,一列用于值 这实际上取决于域模型的外观以及您需要如何管理数据。如果字典值或键发生更改(即重命名、更正等),并且需要在依赖于数据

在我的代码中的某个时刻,我正在创建一个类型为
dictionary
的字典,我想知道将它存储在数据库中的最佳方法是将其转换为字符串,然后再返回到字典


谢谢。

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

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


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

这里有许多选项

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

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

  • 如果没有这种特定于数据库的帮助,您可以只使用文本或BLOB列,并使用对数据库友好的格式(如JSON、XML或特定于语言的序列化格式)序列化词典
权衡如下:

  • 带有键/值列的单独表用于昂贵的查询,通常是PITA,但您可以获得最大的查询灵活性,并且可以跨数据库移植
  • 如果使用数据库支持的字典类型,则可以获得查询支持(即“选择字典中存储的属性与特定条件匹配的行”)。如果没有这些,你只能选择程序中的所有内容并进行过滤,但是
  • 除非编写一个抽象的中间层,否则您将失去数据库的可移植性,并且您将失去代码中数据操作的便利性(因为事情“工作”就像数据库中有一列包含这些数据一样)
为“”的NoSQL数据库正是针对这种类型的存储的。根据您正在做的事情,您可能希望查看一些选项。MongoDB是一个流行的选择


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

为什么不做两列?一列表示键,一列表示值?@evione:因为每个用户都有自己的字典:我需要一列表示用户ID,一列表示字典字符串OK,为什么不使用三列,一列表示
userID
,一列表示
DictionaryKey
,一个用于
DictionaryValue
,表的主键是
UserID
DictionaryKey
的复合键。为什么不使用三列呢?一列用于
UserID
,一列用于
key
,另一列用于
value
?@PeterMajeed:当我需要添加1000个字典时,我该怎么办?好的,那么我将获得Json路由。好的,谢谢您关于MongoDB存储类型的建议。最终,我的应用程序将托管在Azure中,它也有一个键/值数据存储,我稍后会将应用程序更改为该存储。我会非常小心平台特定的KV存储,但这只是我:)这不起作用:每个用户都有自己的dico,因此我无法在添加字典时添加列。好的。我想我会把它扔出去:)听起来序列化是一种方式。JSON的性能比XML好一点。但是,如果您使用MS SQL,并且必须(通过SQL)在字典中查询值,那么XML可能会更好,因为T-SQL支持查询XML,但不支持查询JSON。