目前该站点正在使用关系数据库(MySQL),但加入所有数据的速度太长,并且需要缓存导致其他问题。
问题是这两个表怎么样……
虽然NoSQL通常建议 非规范化 对于数据模型,最好不要在单个数据库条目中包含无界列表。要在DynamoDB中对此数据建模,您应该使用 用于对多对多关系建模的邻接列表 。没有 经济有效 我所知道的数据建模方法,允许您在一次调用中获得所需的所有数据。但是,您已经说速度是最重要的(没有给出延迟要求),因此我将尝试让您了解如果存储在DynamoDB中,您获取数据的速度有多快。
你的模式会变成这样:
Actor { ActorId, <-- This is the application/database id, not the actor's actual ID Name, Age, Bio } Film { FilmId, <-- This is the application/database id for the film Title, Description, ReleaseDate } ActedIn { ActorId, FilmId }
为了表明一个演员在一部电影中表演,你只需要执行一次写作(根据我的经验使用DynamoDB,这一直是一位数毫秒),以便在你的表中添加一个ActedIn项目。
要获得演员的所有电影,您需要查询一次以获得所有关系,然后批量阅读以获取所有电影。查询的典型延迟(根据我的经验)低于10毫秒,具体取决于网络速度和通过网络发送的数据量。由于ActedIn关系是一个如此小的对象,如果您的查询源自同样在AWS数据中心(EC2,Lambda等)中运行的内容,我认为您可以预期查询的平均情况为5毫秒。
获得单个项目将不到5毫秒,您可以并行执行此操作。还有一个BatchGetItems API,但我没有任何统计数据。
那么,你的速度是否足够快~10ms?
如果没有,你可以使用 DAX ,它为DynamoDB添加了一个缓存层,并承诺请求延迟<1ms。
对于每个ActedIn关系,存储您的数据,如下所示:
ActedIn { ActorId, ActorName, ActorAge, ActorBio, FilmId, FilmTitle, FilmDescription, FilmReleaseDate }
您只需要为任何给定的Actor创建一个查询以获取他们所有的电影细节,并且只需要一个查询来获取给定电影的所有Actor细节。 的 实际上不要这样做。 强> 重复数据意味着每次您必须更新Actor的详细信息时,您需要为它们所在的每部电影更新它,并且类似于电影细节。这将是一场可操作的噩梦。
你应该记住NoSQL有很多种类(NoSQL = Not Only SQL),所以即使一个NoSQL解决方案不适合你,你也不应该完全排除它。如果你在一次通话中绝对需要这个,你应该考虑使用 图数据库 (这是另一种NoSQL数据库)。