【问题标题】:Saving a Dictionary(Of String, Int16()) into a PostgreSQL cell将 Dictionary(Of String, Int16()) 保存到 PostgreSQL 单元中
【发布时间】:2018-02-20 13:42:42
【问题描述】:

我有一个Dictionary(of String, INT16()). 这个字典表示来自测量的模拟值。我想将此字典存储到 PostgreSQL 数据库的一个单元格中。我正在使用 Npgsql。

我搜索了很长时间,但我不知道该怎么做。

我的想法是序列化字典并将其保存为数组,但我不确定这是否正确。

有没有人可以在这件事上帮助我?

感谢您的回答

【问题讨论】:

  • 拥有这样的数据库模式不是一个好主意,需要将列表存储在一个字段中。所以在这种情况下,序列化解决方案听起来不错。
  • 常见的方法是什么?保存带有序列化数据的文件,还是将序列化数据保存为字节流?最后我认为是一样的。在这件事上我是菜鸟。
  • 当然是字节数组。为什么你甚至需要一个文件。
  • @ManfredSinger 请再看一下我的示例,我添加了一个完整的示例代码,说明如何在 pg sql 中实现这一点。
  • 谁能解释一下,为什么我不能提问?它有什么问题?好的,在我的第一篇文章中,我没有格式化。这被改变了。但是为什么我被屏蔽了?

标签: c# database postgresql visual-studio npgsql


【解决方案1】:

您可以使用JSON datatype,甚至可以在其上应用functions
这可能是也可能不是一个好方法,这取决于您需要对数据做什么以及您的系统是如何构建的。

【讨论】:

  • 我有一个数据网格视图。它的每一行都代表一个测量运行。我也有一个图表视图。如果我双击特定行,图表视图将显示所选运行的特定模拟值。作为字典提到的这个值应该保存在相应数据库行的一个单元格中。
【解决方案2】:

虽然 JSON(或 JSONB)数据类型应该是上面提到的首选答案,但您也可以选择使用 hstore。缺点是 hstore 只存储字符串,所以你的 int 不会被输入。

【讨论】:

    【解决方案3】:

    看看CREATE TYPE

    CREATE TYPE StringIntPairType AS (k string,v int);
    

    更新: 这是如何从 pg sql 完成此操作的完整示例

    定义字典的元素类型

    CREATE TYPE StringIntPairType AS (k text,v int);
    

    创建一个示例表。请注意,集合列在末尾标记为“[]”

    CREATE TABLE CollectionsTables
    (
      Id SERIAL UNIQUE,
      Collection  StringIntPairType[],
      Description TEXT,
      TS TIMESTAMP NOT NULL DEFAULT now()
    )
    

    插入具有两个字典元素的单个记录

    INSERT INTO CollectionsTables(Collection,Description) VALUES
    (
        array
        [
           ('Test1',1)::StringIntPairType,
           ('Test2',2)::StringIntPairType
        ],
        'Description1'
    );
    

    插入另一个包含两个字典元素的单条记录

    INSERT INTO CollectionsTables(Collection,Description) VALUES
            (
                array
                [
                   ('TestA',30)::StringIntPairType,
                   ('TestB',40)::StringIntPairType
                ],
                'Description2'
            );
    

    请注意,这是普通表,就像任何其他表一样

    SELECT * FROM CollectionsTables
    

    这里有一些更高级的选择。

    SELECT Collection[1].k,Description FROM CollectionsTables
    

    第一列:第一个字典值的键
    第二栏:描述栏

    【讨论】:

    • 这将只允许存储单个字符串/int pair,而不是如上所述的字典(或对集合)。
    • @ShayRojansky 我可以清楚地理解建议的类型代表集合中的单个元素。幸运的是 pg 支持数组...
    • @ShayRojansky 为了您的方便,我添加了一个完整的示例代码,包括数组的使用
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多