У меня вопрос по дизайну базы данных Google Cloud Datastore.Позвольте мне объяснить это на примере:
У меня есть сущности вида " Article " со следующими свойствами:
- title
- userId
- ....
- sumOfScore
SumOfScore должен быть суммой всех связанных объектов "Score", которыеимеют такие свойства, как:
в псевдо-SQL:
sumOfScore = выбрать сумму (балл) из баллов, где Score.articleId = article.id
Я вижу две возможности для создания этого (с помощью API хранилища данных Google):
1.) Нет свойства sumOfScore для статей;но запрос всегда:
Это означает: каждый раз, когда статья читается, мне нужно сделать запрос для этой конкретной статьи для расчета суммыOfScore.Представьте себе список из 100 статей, который показывается пользователю.Это потребует дополнительных 100 запросов к базе данных, просто чтобы показать счет для каждой статьи.
Тем не менее: Это был бы мой предпочтительный способ при использовании Relational-DB.Нет избыточности и хорошая нормализация.А с SQL вы можете использовать только одно соединение-выборку, чтобы перехватить все данные.Но для Cloud Datastore это не кажется правильным.
2.) Рассчитывайте sumOfScore при каждом изменении сущностей Score:
Это означает: всякий раз, когда Score-Entity являетсяПосле добавления, удаления или изменения соответствующая статья обновляет свойство sumOfScore.
Преимущество: при чтении статей дополнительные запросы не требуются.SumOfScore является избыточным для самой сущности.
Недостаток: каждый раз, когда изменяется оценка, существует один дополнительный запрос и дополнительная запись (обновление сущности Article).И sumOfScore может не соответствовать фактическим сущностям Score (например, значение изменяется через консоль DB)
Что думают более опытные люди?Есть ли лучшая практика для такого сценария?Что делают реализацию JPA или JDO под капотом?
Большое спасибо
Мос