【问题标题】:database supports multiple data items for a single key数据库支持单个键的多个数据项
【发布时间】:2021-04-01 21:49:15
【问题描述】:

我需要一个键/值数据库。这样我就可以为每个键保留一个值列表。

我需要数据库支持单个键的多个数据项。

【问题讨论】:

  • 这个问题似乎离题了 - 要求推荐软件产品。另外,请提供更多更多上下文 - 您想要存储的数据有哪些示例?多少数据?您考虑过什么,以及定义“好”的标准是什么?

标签: database key-value


【解决方案1】:

如前所述,这对于几乎任何数据库都是可能的。发布此答案是因为这是一个令人惊讶的常见问题,以表明 这不能成为选择数据库的驱动力。

SQL

这可以在任何 SQL 数据库中完成,通常有多种方式。

非唯一索引

创建关系<key, value>,在key 上放置一个非唯一索引。现在选择一个键的所有值,例如

SELECT value FROM table WHERE key=...

有效地返回多个值。在许多情况下,这已经足够了。

不要忽视JOIN这个表和另一个表,如果某个键的某些值重复而其他值不重复!

数组

SQL 支持ARRAYs。您可以创建具有唯一键和数组值的关系。与往常一样,PostgreSQL 手册部分“Arrays”很好地介绍了您可以使用数组做什么(也适用于其他 SQL 数据库)。

值中的其他数据结构

大多数 SQL 数据库支持许多其他容器数据类型。例如。您可能会查看 PostgreSQL jsonb 类型;它允许您将成熟的 JSON 对象保留为值,在其字段上进行搜索和索引等。如果这是您需要(或寻求)的,这将提供更像文档(“no-SQL”)数据库的体验。

选择哪个?

根据其他要求做出决定。换句话说,您需要更多信息才能做出决定。非唯一键 - 令人惊讶的是 - 通常是性能最高且最容易使用的。除其他事项外,在自己的记录中具有每个键的重复值允许轻松安全的并发访问。如果您需要在所有键的值之间进行简单的原子操作,请选择数组——这是一个不太常见的要求。

NoSQL

“noSQL”数据库通常需要唯一键。它们中的大多数存储 document 值,通常是 JSON 或类似的数据类型。如果您的值包含在数组中,则可以轻松访问该数组。

提示:将数组存储为整个对象通常是一种反模式。更喜欢将数组保留为字段。例如,一个值可能如下所示:

{
    "key": ...,
    "value": {
        "some-words": ["the", "quick", "brown", "fox"]
    }
}

对于许多人来说,noSQL 数据库是解决此要求的一种便捷方法,因为您有时可以预先设计不太详细的架构。 但是请注意,在许多此类数据库中,更新此类数组的单个元素可能会很痛苦。始终确保更新是原子的。更喜欢使用更新或条件操作。

选择哪个?

如上所述:根据其他要求做出决定。换句话说,您仍然需要更多信息才能做出决定。

【讨论】:

    【解决方案2】:

    它可能不适合您的用例,但请查看 Redis 或任何 Key-Value in Memory 数据库(RabbitMQ、Memcached)。

    否则,NoSQL 是将 id 列作为您的键和任何您想要的内容的方式。

    【讨论】:

      【解决方案3】:

      这里有两种可能性:

      1. 使用关系数据库

      该表将具有基于 2 个字段的唯一复合键。一个是您的密钥,另一个是序列号。然后,您可以使用一个键获取所有行。

      1. 使用无 SQL 数据库

      钥匙就是你的钥匙。该值是一个 json 文档,其中包含连接到该键的所有数据项。

      【讨论】:

      • 这里不需要复合。如果您还需要每个值的唯一键,请为此使用自动增量 int。
      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2019-09-04
      • 2020-09-06
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多