我在一个目前正在开发中的项目上使用 RavenDB,所以还没有用户。在这个项目之前,我的背景一直是关系数据库,但总的来说我更喜欢 NoSQL 方法。但是,我还没有任何工作或管理构建在 NoSQL 数据库之上的网站的经验,该数据库的流量很大。我开始了解 Map/Reduce 索引,并在我的解决方案中包含了一些索引,但我想知道:
关于何时创建 Map/Reduce 索引以及何时不创建索引,我应该遵循任何设计规则吗?
我知道这非常依赖于我系统中的业务对象以及它们之间的交互方式。我想我只是在努力了解我可能进行的哪些查询应该使用索引,以及我可以简单地直接查询对象。
以下是我的部分业务领域以及我已经创建索引的位置的快速概览:
我的系统主要由品牌和消费者组成。每个人都有许多社交媒体帐户。当用户通过他们的社交媒体帐户登录时,我有索引BrandsBySocialAccount
和ConsumersBySocialAccount
,它们将这些集合展平并将它们与UserId
品牌或消费者相关联。一旦我有了,UserId
我就可以检索相关的品牌或消费者记录,然后我就走了。
一个品牌可以创建许多活动。我这里有另一个索引,CampaignsByBrand
. 还需要跟踪消费者与活动的交互方式,因此活动可以有许多跟踪条目,用于他们可以与活动执行的不同交互。例如,他们可以从外部跟踪到活动页面的链接,也可以从网站本身中发现一个。正如我解释的那样,我在这里需要索引似乎很清楚。每次交互都有一个索引 ( ClickLinkTrackingEntriesByCampaign
and ViewDetailsTrackingEntriesByCampaign
) 或一个索引 (TrackingEntriesByCampaign
) 包含交互。多个索引在这里过分吗?可能是。目前有 4 种交互类型,以后可能还会介绍其他类型。当我有几条记录时,这些查询非常快。但是当有数十万甚至数百万条记录时,它们仍然会尽可能快吗?
从整体设计来看,似乎对于每个具有可能需要由该集合上的属性查询的集合属性的对象,我应该创建 Map/Reduce 索引。这是一个很好的经验法则吗?还有其他人 - “如果你有这些类型的对象交互,你应该考虑创建这些类型的索引”