【问题标题】:Property address database design in DynamoDB NoSQLDynamoDB NoSQL 中的属性地址数据库设计
【发布时间】:2021-05-21 09:07:54
【问题描述】:

我们拥有数 TB 的地址数据,并且正在研究将其存储在 DynamoDB NoSQL 数据库中的可能性。总的来说,我已经阅读了大量有关 DynamoDB 和 NoSQL 的文章,但是我来自多年的 MS SQL 并且正在为一些 NoSQL 概念而苦苦挣扎。

此时我最大的问题是如何设置表结构,以便我可以适应查询数据的各种不同方式。例如,在常规 SQL 中,我会期望一些查询,例如:

WHERE Address LIKE '%maple st%' AND ZipCode = 12345

WHERE Address LIKE '%poplar ln%' AND City = 'Los Angeles' AND St​​ate = 'CA'

WHERE OwnerName LIKE '%smith%' AND CountyFIPS = '00239'

这些只是示例。实际查询可以是这些不同字段的任意组合。

我不清楚我的索引应该是什么样子,或者表(或多个表)的结构应该如何。谁能让我开始了解它是如何工作的?

【问题讨论】:

    标签: database nosql


    【解决方案1】:

    帖子比较老了,但我会尽量给你一个答案(也许对以后遇到类似问题的人有帮助)。

    DynamoDB 并不是真的要以您描述的方式使用。它的优势在于快速(实际上是快速)查找键/值对。以 IP 地址为例,如果您想真正快速查找与 IP 地址相关的信息,您可以轻松地将 HashKey 设置为带有 IP 地址的字符串并使用它来进行查找。

    当您想在 dynamoDb 中进行查询(或扫描)时,事情开始变得复杂,您可以在此处阅读它们:Query and Scan in DynamDB

    如果不在 HaskKey 或 HaskKey+RangeKey 组合(范围键基本上是复合键)上执行扫描/查询,其要点是非常昂贵的。

    换句话说,我不确定 DynamoDb 是否是正确的方法。对于吸烟快速搜索功能,我会考虑使用Lucene 之类的东西。如果您明智地配置索引,您会惊讶于它的运行速度。

    希望这会有所帮助。

    编辑: 似乎亚马逊现在增加了对二级索引的支持: See here

    【讨论】:

      【解决方案2】:

      DynamoDB 旨在以作者描述的问题的方式使用,请参阅此LINK,其中 AWS 文档描述了创建这样的二级索引

      [country]#[region]#[state]#[county]#[city]#[neighborhood]
      

      根据您要查找的内容,分区键也可以是这样的。

      在 DynamoDB 中,您在创建表之前创建连接。这意味着您必须考虑您打算搜索数据、创建索引以及使用它们查询数据的所有方式。

      AWS 创建了AWS noSQL WorkBench 来帮助团队做到这一点。在撰写本文时,该应用程序中存在一些 UI 错误;有关错误的更多信息,请参阅LINK。

      为了回顾您提到的一些查询,我将分享一些您可以创建索引来创建该查询的可能性。

      注意: noSQL 在某些情况下表示非规范化数据,但不一定。

      对于键的形状应该有限制,以便 dynamoDB 可以对实际服务器进行分区以进行扩展;更多信息请参考partition keys。

      dynamoDB 的魔力在于一个经过深思熟虑的模型,它还可以在表创建并用于生产之后处理新查询。网上有大量的帖子和视频解释了如何做到这一点。

      这里是 Rick Houlihan link 的一个。 Rick Houlihan 是 DynamoDB 的主要设计师,所以去那里寻求福音吧。

      要进行您尝试的查询,可以创建多个键,主要是初始分区键和辅助键。 Rick 建议让它们像 PK 和 SK 一样通用。

      然后尝试以大量独特性来塑造 PK,例如邮政编码 PK:“12345”的分区键可能包含大量数据,可能超过任何分区键限制的 10GB 配额。

      示例 1:地址如 '%maple st%' AND ZipCode = 12345

      例如1,我们可以塑造一个PK的分区键:“12345:maple” 然后只需调用“12345:maple”的 PK 即可检索具有该邮政编码以及枫树街道的所有数据。会有许多不同的 PK,而这正是 dynamoDB 擅长的:水平扩展。

      示例 2:WHERE Address LIKE '%poplar ln%' AND City = 'Los Angeles' AND St​​ate = 'CA'

      在示例 2 中,我们可以使用二级索引添加另一种更具体的方式,例如 PK: "12345:poplar" SK: "losangeles:ca:other:info:that:helps"

      示例 3:WHERE OwnerName LIKE '%smith%' AND CountyFIPS = '00239'

      例如 3,我们没有街道名称。我们需要知道街道名称来查询数据,但我们可能在搜索中没有它。这是一个人需要完全理解他们的基本查询模式并塑造 PK 在查询时很容易知道的地方,同时仍然非常独特,这样我们就不会超出分区限制。拥有街道名称可能不是最佳选择,这完全取决于需要什么查询。

      在最后一个示例中,添加一些全局二级索引可能更合适,这意味着创建新的主键和辅助键来映射到数据属性(列),如 CountyFIPS。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2020-03-06
        相关资源
        最近更新 更多