【发布时间】:2018-05-06 06:36:59
【问题描述】:
我目前有一个 SQL Server 数据库,其中包含一个包含 400,000 部电影的表。我有另一个包含数千个用户的表。
CREATE TABLE [movie].[Header]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[SourceId] [int] NOT NULL,
[ReleaseDate] [Date] NOT NULL,
[Title] [nvarchar](500) NOT NULL
)
CREATE TABLE [account].[Registration]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Username] [varchar](50) NOT NULL,
[PasswordHash] [varchar](1000) NOT NULL,
[Email] [varchar](100) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[UpdatedAt] [datetime] NOT NULL
)
CREATE TABLE [movie].[Likes]
(
[Id] [uniqueidentifier] NOT NULL,
[HeaderId] [int] NOT NULL,
[UserId] [int] NOT NULL,
[CreatedAt] [datetime] NOT NULL
)
CREATE TABLE [movie].[Dislikes]
(
[Id] [uniqueidentifier] NOT NULL,
[HeaderId] [int] NOT NULL,
[UserId] [int] NOT NULL,
[CreatedAt] [datetime] NOT NULL
)
从未来两周开始,每位用户都会看到 100 部电影。然后他们可以执行喜欢、不喜欢、推荐等操作。
我正在将整个应用程序迁移到无服务器架构中。我通过 Lambda + API Gateway 在 AWS 中运行 API,现在我正在考虑将 DynamoDB 用于数据库。我不认为我有什么超级疯狂的东西会阻止我将数据存储在 Dynamo 中,而且它们的定价/消费模型似乎比 SQL Server(目前托管在 Azure 中)便宜得多。
我遇到的一件事是了解我将如何对用户在电影中执行动作进行建模。如果他们“喜欢”一部电影,它就会进入一个喜欢列表,他们可以回去访问。在那里,我向他们展示了整个移动记录(实际上包含更多数据,例如演员/工作人员/评级等。我只是截断了电缆以简化它)。如果我将每个“Like”作为一个项目存储在 Dynamo 中,并将整个电影作为一个属性存储,我认为用户文档会变得非常大。
我还需要在两周后继续向用户展示他们没有执行任何操作的电影。他们对我执行了操作的电影需要从查询中删除。今天我只是加入电影表和用户操作表,从用户操作表中已经存在的查询中删除电影。我将如何在 NoSql 中以相同的最终结果对其进行建模?
我可以将喜欢/不喜欢合并到具有动作类型属性(表示喜欢/不喜欢等)的单个文档中,以及已执行该动作的电影数组。仍然不确定我将如何过滤 [Header] 查询,以便用户文档中的电影不会回来。
我想我会将电影哈希键设置为分片的发布日期,因为平均每个发布日期大约有 10 部电影。这给出了一个很好的分布。我想我会使用用户 ID 具有哈希键的文档,该文档包含用户执行过操作的所有电影;不知道这是否是正确的道路。
我从未处理过 NoSql,所以我想请教一下。我不确定如何最好地设计本质上是一对多的东西,但每个用户的电影可能有数万部。
【问题讨论】:
-
Dynamodb 真正是关于了解您的数据访问模式。比如,什么是最常用的查询,什么是批量写入或读取的,而不是随着时间的推移轻轻分布...例如,用户获得尚未喜欢/不喜欢的电影列表的频率是否比获得已经喜欢的动作列表的频率高得多。平均而言,每个查询要返回多少个项目? DynamoDB 主要是关于进行良好的权衡。顺便说一句,“文档”不是 dynamoDB 术语 :)
-
简而言之,您能否详细说明什么对您来说更重要/更重。您的取舍可能是什么
-
最常用的查询是显示用户尚未喜欢/不喜欢的电影列表的查询,以及电影的所有演员和工作人员(可以是 60 人)以及电影详细信息(评级、流派、描述等)。第二个查询是用户喜欢/不喜欢的所有电影。目前,它是对喜欢和另一个不喜欢的单独查询。不过,这似乎是我可以轻松组合的东西。喜欢/不喜欢查询还向用户展示了所有演员/工作人员和电影的详细信息。
-
目前我们有 400,000 部电影。将其乘以演员/工作人员记录,可以尝试复制大量数据。如果我应该保留一张电影表,那么我应该保留一张用户表,其中包含代表所有喜欢/不喜欢的属性。在某些情况下,我们已经看到用户在一天之内喜欢/不喜欢 1,000 部电影,因此在应用内会产生分页需求。
标签: nosql amazon-dynamodb