Лучшая практика отслеживания прочитанных статей в Firestore при сохранении ограничений бесплатной квоты — SwiftUI/iOS [зIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Лучшая практика отслеживания прочитанных статей в Firestore при сохранении ограничений бесплатной квоты — SwiftUI/iOS [з

Сообщение Anonymous »

Я разрабатываю ios-приложение для чтения новостей, которое читает статьи из Firestore — на данный момент специально для меня. Приложению необходимо отслеживать, какие статьи я прочитал, но меня беспокоит превышение ежедневной бесплатной квоты в 20 000 операций записи. В настоящее время я пишу в базу данных несколько тысяч статей в день. (Я не читаю их все, а просто просматриваю заголовки). Позже, возможно, если будет больше пользователей, экономия на операциях записи станет еще большей проблемой.
  • Какой наиболее эффективный способ отслеживать статус чтения без чрезмерных операций записи? ?
  • Следует ли мне создать отдельную коллекцию для статуса чтения?
  • Есть ли более эффективные подходы для обработки этого варианта использования, не выходя за пределы свободной квоты?< /li>
Текущая настройка

Код: Выделить всё

struct Article {
let id: String
let title: String
let content: String
let isRead: Bool
let timestamp: Date
}
Технические подробности
  • Платформа: iOS/SwiftUI
  • База данных: Firebase Firestore
  • Операций записи в день: ~1000–3000
  • Ограничения уровня бесплатного пользования вызывают беспокойство
Что я пробовал
Я подумывал обновить документ статьи напрямую:

Код: Выделить всё

func markAsRead(articleId: String) async throws {
let ref = db.collection("articles").document(articleId)
try await ref.updateData([
"isRead": true,
"readTimestamp": Date()
])
}
  • Приложению необходимо отслеживать статус прочитанного/непрочитанного для каждого пользователя.
  • Поддержку в автономном режиме было бы неплохо иметь, но это не обязательно.
  • Обновление в режиме реального времени не требуется.
Обновление: Я рассматриваю возможность другой подход, который может быть более эффективным:
Вместо того, чтобы отмечать отдельные статьи как прочитанные, я мог бы хранить только одна временная метка, показывающая, когда пользователь в последний раз просматривал свои статьи:

Код: Выделить всё

// Structure in Firestore
users/{userId}/reading/{deviceId} {
lastReadTimestamp: timestamp
}

// Update timestamp when user reads articles
func updateLastRead(userId: String, deviceId: String) async throws {
let ref = db.collection("users").document(userId)
.collection("reading").document(deviceId)

try await ref.setData([
"lastReadTimestamp": FieldValue.serverTimestamp()
])
}

// Query unread articles
func getUnreadArticles(userId: String, deviceId: String) async throws -> [Article] {
let readingDoc = try await db.collection("users")
.document(userId)
.collection("reading")
.document(deviceId)
.getDocument()

let lastRead = readingDoc.data()?["lastReadTimestamp"] as? Timestamp ?? Timestamp(date: Date(timeIntervalSince1970: 0))

let snapshot = try await db.collection("articles")
.whereField("timestamp", isGreaterThan: lastRead)
.getDocuments()

return snapshot.documents.map { /* mapping logic */ }
}

Преимущества этого подхода:
Только одна операция записи за сеанс чтения вместо маркировки каждой статьи.
Эффективный запрос с использованием сравнения временных меток.
Можно отслеживать статус чтения для каждой статьи. устройство
Хорошо масштабируется при работе с большим количеством статей
Находится в пределах свободной квоты
Будет ли это лучшим решением? Есть ли какие-либо недостатки, которые мне следует учитывать?


Подробнее здесь: https://stackoverflow.com/questions/791 ... ithin-free
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»