Subscribing to database changes in Supabase - Time & Space Complexity
When we subscribe to database changes, we want to know how the work grows as more changes happen.
We ask: How does the number of updates affect the system's work?
Analyze the time complexity of the following operation sequence.
const subscription = supabase
.channel('table_changes')
.on('postgres_changes', { event: '*', schema: 'public', table: 'messages' }, payload => {
console.log('Change received:', payload)
})
.subscribe()
This code listens for all changes on the 'messages' table and runs a function each time a change happens.
Identify the API calls, resource provisioning, data transfers that repeat.
- Primary operation: Receiving and processing each database change event.
- How many times: Once per change event that occurs on the table.
Each new change triggers one event call, so the work grows directly with the number of changes.
| Input Size (n) | Approx. Api Calls/Operations |
|---|---|
| 10 | 10 event calls |
| 100 | 100 event calls |
| 1000 | 1000 event calls |
Pattern observation: The number of operations grows in a straight line with the number of changes.
Time Complexity: O(n)
This means the work grows directly in proportion to the number of database changes received.
[X] Wrong: "Subscribing to changes only triggers one operation no matter how many changes happen."
[OK] Correct: Each change sends a separate event, so the system processes each one individually, increasing work as changes increase.
Understanding how event subscriptions scale helps you design systems that handle live updates smoothly and predict their load.
"What if we batch multiple changes into one event? How would the time complexity change?"
Practice
Solution
Step 1: Understand the purpose of subscriptions
Subscriptions listen for database changes and update the app data live.Step 2: Compare options with subscription benefits
Only Keep app data live and updated automatically describes automatic live updates, matching subscription behavior.Final Answer:
Keep app data live and updated automatically -> Option AQuick Check:
Subscriptions = live data updates [OK]
- Thinking subscriptions store data locally
- Confusing subscriptions with manual refresh
- Assuming subscriptions encrypt data
Solution
Step 1: Recall correct Supabase subscription syntax
The correct method is supabase.from('table').on('EVENT', callback).subscribe().Step 2: Match syntax to options
supabase.from('messages').on('INSERT', callback).subscribe() matches this syntax with 'messages' and 'INSERT' event.Final Answer:
supabase.from('messages').on('INSERT', callback).subscribe() -> Option BQuick Check:
Correct syntax = supabase.from('messages').on('INSERT', callback).subscribe() [OK]
- Using .table() instead of .from()
- Listening to wrong event type
- Incorrect method chaining order
supabase.from('tasks').on('INSERT', payload => {
console.log('New task:', payload.new);
}).subscribe()Solution
Step 1: Understand the callback payload on INSERT
The payload contains a 'new' property with the inserted row data as an object.Step 2: Analyze console.log output
Logging 'New task:' plus payload.new prints the object as '[object Object]' in console.Final Answer:
New task: [object Object] with new row data -> Option DQuick Check:
Payload.new logs inserted row object [OK]
- Expecting payload.new to be undefined
- Confusing payload.new with payload.old
- Assuming subscription needs extra setup to log
const subscription = supabase.from('orders').on('DELETE', () => {
console.log('Order deleted');
})Solution
Step 1: Check subscription activation
The .subscribe() method is required to start listening to events.Step 2: Verify event type and callback
'DELETE' is a valid event, and callback can omit payload if unused.Final Answer:
Missing .subscribe() call to activate subscription -> Option AQuick Check:
Always call .subscribe() to activate [OK]
- Forgetting .subscribe() call
- Using wrong event names
- Thinking callback must have parameters
Solution
Step 1: Understand event subscription chaining
Supabase allows chaining .on() calls for different events before .subscribe().Step 2: Evaluate each option's syntax
supabase.from('profiles').on('INSERT', payload => console.log(payload.new)).on('UPDATE', payload => console.log(payload.new)).subscribe() chains .on('INSERT', ...).on('UPDATE', ...) correctly; others use invalid event formats.Final Answer:
supabase.from('profiles').on('INSERT', payload => console.log(payload.new)).on('UPDATE', payload => console.log(payload.new)).subscribe() -> Option CQuick Check:
Chain .on() for multiple events [OK]
- Trying to pass multiple events as array or comma string
- Calling .subscribe() too early
- Not chaining .on() properly
Ready to prove it?
Pass the test and this pattern moves unknown
