我想存储任意的键值对。例如,
{:foo "bar" ; string
:n 12 ; long
:p 1.2 ; float
}
在数据学中,我想将其存储为以下内容:
[{: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
等。它有自己的问题,比如确保一次只使用一个值属性。有什么建议吗?
发布于 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“等。最好是有一个验证函数,它可以接受任何记录/实体,并验证在任何给定时间使用的只有一个“类型”。
发布于 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
。
备注:
https://stackoverflow.com/questions/43955457
复制相似问题