Я работаю над системой рекомендаций, использующей две основные сущности: пользователей и объекты. Показатели сходства пользователей будут предварительно рассчитаны на основе существующих пользовательских данных. Затем, поскольку различные пользователи «помечают» объекты, объекты будут рекомендованы каждому пользователю (в зависимости от того, что было помечено аналогичными пользователями).
Я новичок в NoSQL и не знаю, как лучше всего моделировать а) события пользовательских флагов и б) рекомендации для конкретных пользователей. Два варианта кажутся мне очевидными:
1) Опция «Heavyweight»: хранить все соответствующие данные в первичных объектах. E.g.:
UserA
FlaggedItems
FlaggedItemA
FlaggedItemB
FlaggedItemC
RecommendedItems
RecommendedItemA
RecommendedItemB
RecommendedItemC
или
ItemA
FlaggedBy
UserA
UserC
UserR
RecommendedTo
UserB
UserD
UserX
2) Опция «Lightweight»: хранить данные «Flag» и «Рекомендации» в гранулированных объектах. E.g.:
FlagEvent
FlaggedBy
UserA
FlaggedItem
ItemA
DateTime
RecommendationEvent
RecommendationTo
UserC
RecommendedItem
ItemB
DateTime
Я предполагаю, что облегченный метод будет более масштабируемым, так как объекты User / Item не будут постоянно изменяться, синхронизация клиента будет включать захват пользовательских пользовательских флагов FlagEvents и Рекомендации, и не будет шансов, что несколько пользователей попытаются изменить один и тот же объект одновременно. Но я новичок в CouchDB / noSQL и приветствую мысли более опытных пользователей. Что бы вы предложили?