【发布时间】:2021-04-01 21:49:15
【问题描述】:
我需要一个键/值数据库。这样我就可以为每个键保留一个值列表。
我需要数据库支持单个键的多个数据项。
【问题讨论】:
-
这个问题似乎离题了 - 要求推荐软件产品。另外,请提供更多更多上下文 - 您想要存储的数据有哪些示例?多少数据?您考虑过什么,以及定义“好”的标准是什么?
我需要一个键/值数据库。这样我就可以为每个键保留一个值列表。
我需要数据库支持单个键的多个数据项。
【问题讨论】:
如前所述,这对于几乎任何数据库都是可能的。发布此答案是因为这是一个令人惊讶的常见问题,以表明 这不能成为选择数据库的驱动力。
这可以在任何 SQL 数据库中完成,通常有多种方式。
创建关系<key, value>,在key 上放置一个非唯一索引。现在选择一个键的所有值,例如
SELECT value FROM table WHERE key=...
有效地返回多个值。在许多情况下,这已经足够了。
不要忽视JOIN这个表和另一个表,如果某个键的某些值重复而其他值不重复!
SQL 支持ARRAYs。您可以创建具有唯一键和数组值的关系。与往常一样,PostgreSQL 手册部分“Arrays”很好地介绍了您可以使用数组做什么(也适用于其他 SQL 数据库)。
大多数 SQL 数据库支持许多其他容器数据类型。例如。您可能会查看 PostgreSQL jsonb 类型;它允许您将成熟的 JSON 对象保留为值,在其字段上进行搜索和索引等。如果这是您需要(或寻求)的,这将提供更像文档(“no-SQL”)数据库的体验。
根据其他要求做出决定。换句话说,您需要更多信息才能做出决定。非唯一键 - 令人惊讶的是 - 通常是性能最高且最容易使用的。除其他事项外,在自己的记录中具有每个键的重复值允许轻松安全的并发访问。如果您需要在所有键的值之间进行简单的原子操作,请选择数组——这是一个不太常见的要求。
“noSQL”数据库通常需要唯一键。它们中的大多数存储 document 值,通常是 JSON 或类似的数据类型。如果您的值包含在数组中,则可以轻松访问该数组。
提示:将数组存储为整个对象通常是一种反模式。更喜欢将数组保留为字段。例如,一个值可能如下所示:
{
"key": ...,
"value": {
"some-words": ["the", "quick", "brown", "fox"]
}
}
对于许多人来说,noSQL 数据库是解决此要求的一种便捷方法,因为您有时可以预先设计不太详细的架构。 但是请注意,在许多此类数据库中,更新此类数组的单个元素可能会很痛苦。始终确保更新是原子的。更喜欢使用更新或条件操作。
如上所述:根据其他要求做出决定。换句话说,您仍然需要更多信息才能做出决定。
【讨论】:
它可能不适合您的用例,但请查看 Redis 或任何 Key-Value in Memory 数据库(RabbitMQ、Memcached)。
否则,NoSQL 是将 id 列作为您的键和任何您想要的内容的方式。
【讨论】:
这里有两种可能性:
该表将具有基于 2 个字段的唯一复合键。一个是您的密钥,另一个是序列号。然后,您可以使用一个键获取所有行。
钥匙就是你的钥匙。该值是一个 json 文档,其中包含连接到该键的所有数据项。
【讨论】: