首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >存储任意类型的值

存储任意类型的值
EN

Stack Overflow用户
提问于 2017-05-14 00:32:07
回答 2查看 163关注 0票数 1

我想存储任意的键值对。例如,

代码语言:javascript
运行
复制
{:foo "bar" ; string
 :n 12 ; long
 :p 1.2 ; float
}

在数据学中,我想将其存储为以下内容:

代码语言:javascript
运行
复制
[{:kv/key "foo"
  :kv/value "bar"}
 {:kv/key "n"
  :kv/value 12}
 {:kv/key "p"
  :kv/value 1.2}]

问题是:kv/value在数据结构中只能有一种类型。一种解决方案是将:kv/value拆分成:kv/value-string:kv/value-long:kv/value-float等。它有自己的问题,比如确保一次只使用一个值属性。有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-14 05:00:10

如果你能给出更多关于你的特定用例的细节,可能会更容易找出最佳答案。在这一点上,这是一个有点神秘的,为什么你可能想要一个属性,有时可以是一个字符串,有时是一个整数,等等。

从你到目前为止所说的,你唯一真正的答案是拥有不同的属性,比如value-string等。这就像在SQL DB中,每个表列只有一个类型,并且需要不同的列来存储字符串、整数等。

正如您的问题所示,任何工具(如DB)都是在某些假设的基础上设计的。在这种情况下,DB假设每个“列”(在数据中的属性)总是属于相同的类型。DB还假设您(通常)希望每个记录/实体的所有列/属性中都有数据。

在你的问题中,你与这两个假设都是矛盾的。虽然您仍然可以使用DB来存储信息,但您必须编写自定义函数,以确保一次只使用一个属性(value-string、value-int等)。您可能需要自定义插入函数,如"insert-str-val“、"insert-int-val”等,以及自定义读取函数" read -str-val“等。最好是有一个验证函数,它可以接受任何记录/实体,并验证在任何给定时间使用的只有一个“类型”。

票数 0
EN

Stack Overflow用户

发布于 2017-05-15 15:19:35

通过将:kv/key设置为:db.unique/identity属性,并将:kv/value设置为字节类型或字符串类型,并以您喜欢的格式对值进行编码(例如,对于:db.types/bytes为fressian / nippy,对于:db.types/string为edn / json ),您可以模拟具有异构值的键值存储。在这种情况下,我建议将:kv/value:db/index设置为false

备注:

  1. 您将拥有有限的查询能力,因为这些值将不会被索引,并且需要为每个查询反序列化。
  2. 如果您想运行读取或写入值的事务函数(例如,用于数据迁移),则应使您的编码/解码库也可供事务处理者使用。
  3. 如果值较大(例如,超过20kb),请不要将其存储在Datomic中;请使用互补的存储服务,如AWS S3,并存储URL。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43955457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档