Database dynamodbnosql中的属性地址数据库设计

Database dynamodbnosql中的属性地址数据库设计,database,nosql,Database,Nosql,我们有几TB的地址数据,正在研究将其存储在DynamoDB NoSQL数据库中的可能性。一般来说,我对DynamoDB和NoSQL做了很多阅读,但我来自多年的MS-SQL,并且正在与一些NoSQL概念作斗争 在这一点上,我最大的问题是如何设置表结构,以便能够适应查询数据的各种不同方式。例如,在常规SQL中,我希望出现如下查询: 其中地址“%maple st%”和ZipCode=12345 其中地址为“%ln%”,城市为“洛杉矶”,州为“CA” 其中,所有者名称如“%smith%”和CountyP

我们有几TB的地址数据,正在研究将其存储在DynamoDB NoSQL数据库中的可能性。一般来说,我对DynamoDB和NoSQL做了很多阅读,但我来自多年的MS-SQL,并且正在与一些NoSQL概念作斗争

在这一点上,我最大的问题是如何设置表结构,以便能够适应查询数据的各种不同方式。例如,在常规SQL中,我希望出现如下查询:

其中地址“%maple st%”和ZipCode=12345

其中地址为“%ln%”,城市为“洛杉矶”,州为“CA”

其中,所有者名称如“%smith%”和CountyPips='00239'

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


我不清楚我的索引应该是什么样的,或者表(或多个表)应该如何构造。有人能让我开始理解这是怎么回事吗?

这篇文章相对来说比较老,但我会尝试给你一个答案(也许这对将来有类似问题的人会有帮助)

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

当您想在dynamoDb中执行查询(或扫描)时,事情开始变得复杂起来,您可以在此处阅读:

要点是,如果不在HaskKey或HaskKey+RangeKey组合(范围键基本上是复合键)上执行扫描/查询,那么成本会非常高

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

希望这有帮助

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

DynamoDB是按照作者描述的方式构建的,AWS文档描述了如何创建这样的二级索引

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

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

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

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

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

对于如何塑造键,以使dynamoDB能够划分实际服务器以进行扩展,存在一些限制;有关更多信息,请参阅

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

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

要进行您正在尝试的查询,需要创建多个键,主要是初始分区键和辅助键。Rick建议保持它们的通用性,如PK和SK

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

示例1:其中地址“%maple st%”和ZipCode=12345

例如1,我们可以设置一个分区键PK:“12345:maple” 然后只要调用“12345:maple”的PK就可以检索到带有该邮政编码的所有数据以及maple的街道。将会有很多不同的PK,这就是dynamoDB做得很好的地方:水平缩放

示例2:其中地址为“%ln%”,城市为“洛杉矶”,州为“CA”

在示例2中,我们可以使用二级索引添加另一种更具体的方法,例如PK:“12345:杨树”SK:“洛杉矶:ca:其他:信息:那:帮助”

示例3:其中所有者名称如“%smith%”和CountyPips='00239'

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

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

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