2

我们拥有数 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'

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

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

4

2 回答 2

0

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

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

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

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

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

希望这可以帮助。

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

于 2013-04-12T15:26:43.597 回答
0

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

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

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

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

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

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

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

应该如何塑造键是有限制的,以便 dynamoDB 可以对实际服务器进行分区以进行扩展;有关详细信息,请参阅分区键

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

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

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

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

示例 1:WHERE Address LIKE '%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 在查询时很容易知道的地方,同时仍然非常独特,这样我们就不会超出分区限制。拥有街道名称可能不是最佳选择,这完全取决于需要什么查询。

In this last example, it may be more appropriate to add some global secondary indices, which just means making new primary key and secondary keys that map to data attribute (column) like CountyFIPS.

于 2021-05-21T01:07:54.473 回答