REST API vs GraphQL
REST mit über 20 Jahren Geschichte trifft auf GraphQL, das bei Facebook entstand. Welches API-Designparadigma sollten Sie für Ihr Mobile-App-Backend wählen?
Googles umfassende Plattform für die mobile App-Entwicklung
Open-Source-Alternative zu Firebase — PostgreSQL-basiert, selbst hostbar
| Kategorie | Firebase | Supabase |
|---|---|---|
| Performance | 9/10 | 9/10 |
| Erlernbarkeit | 8/10 | 7/10 |
| Ökosystem | 10/10 | 7/10 |
| Community | 9/10 | 8/10 |
| Arbeitsmarkt | 9/10 | 7/10 |
| Zukunftssicherheit | 7/10 | 9/10 |
// Firebase – Chat-Nachrichten in Echtzeit
import FirebaseFirestore
import FirebaseAuth
import SwiftUI
@Observable
class ChatViewModel {
var messages: [Message] = []
private var listener: ListenerRegistration?
private let db = Firestore.firestore()
struct Message: Identifiable, Codable {
@DocumentID var id: String?
let senderId: String
let senderName: String
let text: String
let timestamp: Timestamp
}
func startListening(roomId: String) {
listener = db.collection("rooms")
.document(roomId)
.collection("messages")
.order(by: "timestamp", descending: false)
.limit(toLast: 50)
.addSnapshotListener { [weak self] snapshot, error in
guard let documents = snapshot?.documents else { return }
self?.messages = documents.compactMap {
try? $0.data(as: Message.self)
}
}
}
func sendMessage(text: String, roomId: String) async throws {
guard let user = Auth.auth().currentUser else { return }
let message = Message(
senderId: user.uid,
senderName: user.displayName ?? "Anonim",
text: text,
timestamp: Timestamp()
)
try db.collection("rooms")
.document(roomId)
.collection("messages")
.addDocument(from: message)
}
func stopListening() { listener?.remove() }
}// Supabase – CRUD für Nutzerbeiträge
import Supabase
import Foundation
struct Post: Codable, Identifiable {
let id: UUID
let userId: UUID
let title: String
let content: String
let createdAt: Date
enum CodingKeys: String, CodingKey {
case id, title, content
case userId = "user_id"
case createdAt = "created_at"
}
}
class PostRepository {
private let client = SupabaseClient(
supabaseURL: URL(string: ProcessInfo.processInfo.environment["SUPABASE_URL"]!)!,
supabaseKey: ProcessInfo.processInfo.environment["SUPABASE_ANON_KEY"]!
)
func fetchPosts() async throws -> [Post] {
try await client
.from("posts")
.select("*")
.order("created_at", ascending: false)
.limit(20)
.execute()
.value
}
func createPost(title: String, content: String) async throws -> Post {
let userId = try await client.auth.session.user.id
return try await client
.from("posts")
.insert(["user_id": userId.uuidString, "title": title, "content": content])
.select()
.single()
.execute()
.value
}
func subscribeToNewPosts(onNewPost: @escaping (Post) -> Void) -> RealtimeChannelV2 {
let channel = client.channel("public:posts")
channel.onPostgresChange(
InsertAction.self,
table: "posts"
) { change in
if let post = try? change.record.decode(as: Post.self) {
onNewPost(post)
}
}
Task { await channel.subscribe() }
return channel
}
}Firebase ist stark bei schneller Entwicklung, exzellentem iOS-SDK und Echtzeitfunktionen. Bei relationalen Daten, SQL-Flexibilität, Open Source und Bedenken wegen Vendor-Lock-in ist Supabase die bessere Wahl. 2025 reift Supabase rasant heran und wird zu einer ernstzunehmenden Alternative — besonders die pgvector-Integration für KI-Funktionen sticht hervor.
Kostenlose Beratung erhaltenMöglich, aber nicht einfach. Die NoSQL-Struktur von Firestore muss in ein PostgreSQL-Schema umgewandelt, Auth-Nutzer müssen migriert und Storage-Dateien übertragen werden. Das erfordert ein umfangreiches Migrationsprojekt.