В настоящее время у меня есть база данных 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 фильмов, начиная с двух недель в будущем. Затем они могут выполнять такие действия, как: нравится, не нравится, рекомендовать и т. Д.
Я нахожусь в процессе перевода всего приложения в безсерверную архитектуру. У меня API работают в AWS через Lambda + API Gateway, и теперь я смотрю на использование DynamoDB для базы данных. Я не думаю, что у меня есть что-то сверхъестественное, что помешало бы мне хранить данные в «Динамо», и их модель ценообразования / потребления, похоже, будет существенно дешевле, чем SQL Server (в настоящее время размещенный в Azure).
Единственное, с чем у меня проблемы, - это понимание того, как я буду моделировать пользователей, выполняющих действие над фильмом. Если им «нравится» фильм, он попадает в список лайков, к которому они могут вернуться и посетить. Там я представляю им всю запись о движении (которая на самом деле состоит из большего количества данных, таких как приведение / команда / рейтинги и т. Д. Я просто обрезал кабель, чтобы упростить его). Если бы я сохранил каждое «Мне нравится» как элемент в «Динамо» вместе со всем фильмом в качестве атрибута, я бы подумал, что документ пользователя станет очень большим.
Мне также нужно продолжать показывать пользователям фильмы, начиная с двух недель, когда они не выполняли никаких действий. Фильмы, над которыми они выполнили действия, нужно удалить из запроса. Сегодня я просто присоединяюсь к таблице фильмов и таблице действий пользователей, удаляя фильмы из запроса, который уже существует в таблице действий пользователей. Как бы я смоделировал это в NoSql с таким же конечным результатом?
Я могу объединить лайки / дислайки в один документ с атрибутом типа действия (представляющим лайк / дислайк и т. Д.) И массивом фильмов, над которыми было выполнено действие. Еще не уверен, как мне отфильтровать запрос [Header]
, чтобы фильмы в документе пользователя не возвращались.
Я подумал, что установлю хэш-ключ своих фильмов на дату выпуска шардинга, поскольку в среднем на каждую дату выпуска приходится примерно 10 фильмов. Это дает хорошее распределение. Я решил, что использовать идентификатор пользователя с ключом хеша для документа, содержащего все фильмы, над которыми пользователь выполнил действие; не уверен, что это правильный путь.
Я никогда не имел дела с NoSql, поэтому я хотел попросить ввода. Я не уверен, как лучше всего спроектировать что-то, что по сути является одно-многим, но с потенциалом для фильмов на пользователя, составляющих десятки тысяч.