Your Database Is Probably Wrong
Most Adalo performance problems aren't caused by the platform - they're caused by database architecture. Builders coming from spreadsheet backgrounds create collections that mirror Excel tabs: wide, flat, and full of redundant data. This works for prototypes but creates cascading performance problems as the app grows.
As certified Adalo Experts, we've restructured dozens of Adalo databases. Here's the framework we use.
The 4 Database Architecture Rules
Rule 1: One Entity Per Collection
Each collection should represent exactly one thing: Users, Orders, Products, Messages. Don't create a 'Data' collection that holds everything. Don't add product fields to the Orders collection. Every entity gets its own collection.
Why it matters: Adalo loads ALL fields when it queries a collection. A collection with 30 properties loads 30 fields for every record, even if the screen only displays 3. Separate collections mean leaner queries.
Rule 2: Limit Relationship Depth to 2 Levels
Adalo resolves relationships recursively. If a User has Orders, and each Order has Items, and each Item has Reviews - that's 4 levels of data resolution. Each level multiplies the number of database queries.
The rule: Never go deeper than 2 levels of relationships in a single screen. If you need data from level 3+, navigate to a new screen and load it there.
Rule 3: Denormalize for Performance
In traditional databases, you avoid redundant data (normalization). In Adalo, strategic redundancy improves performance:
- Store the
userNamedirectly on the Order record instead of looking it up via relationship - Store a
reviewCountproperty on the Product instead of counting related reviews on every screen load - Store the
latestMessageTexton the Conversation instead of loading all messages to find the last one
Update these denormalized fields via action chains whenever the source data changes.
Rule 4: Archive Aggressively
If your app generates time-series data (messages, logs, notifications, activity feed items), implement archiving. Create an ArchivedMessages collection and move records older than 90 days using a scheduled custom action or external automation.
Active collections should stay under 2,000 records for optimal performance.
Common Architecture Patterns
Pattern: Marketplace App
| Collection | Key Properties | Relationships |
|---|---|---|
| Users | name, email, type (buyer/seller) | has many Listings, has many Orders |
| Listings | title, price, description, image, status | belongs to User (seller) |
| Orders | total, status, buyerName (denormalized) | belongs to User (buyer), belongs to Listing |
| Reviews | rating, text, reviewerName (denormalized) | belongs to Order |
Pattern: Community/Social App
| Collection | Key Properties | Relationships |
|---|---|---|
| Users | name, avatar, bio, postCount | has many Posts, has many Follows |
| Posts | text, image, likeCount, commentCount | belongs to User |
| Comments | text, authorName (denormalized) | belongs to Post, belongs to User |
| Follows | followerId, followingId | belongs to User (x2) |
Migration Indicators
Your database architecture is at its limit when:
- Any collection exceeds 5,000 records
- Screen load times exceed 3 seconds despite optimization
- You need computed fields (averages, rankings, search indices)
- You need full-text search across collections
At this point, either move to an external database (Xano) or migrate to a custom-built solution with a proper relational database.
Rehost restructures Adalo databases and builds migration paths to scalable architectures. Get a free database audit →
FAQ
How many records can an Adalo collection handle?
Under 2,000 records per collection is the comfort zone. Between 2,000–5,000, you'll notice performance degradation. Above 5,000, you should move to an external database or archive old records.
Should I use one-to-many or many-to-many relationships?
Use one-to-many when the relationship is parent-child (a User has many Orders). Use many-to-many only when both sides can have multiple connections (a Student has many Classes, a Class has many Students). Many-to-many creates a junction collection that adds query overhead.
How do I fix slow lists in Adalo?
Limit visible items to 20, compress images under 200KB, reduce the number of displayed properties per list item, and make sure you're not loading related data beyond 2 levels deep. See our complete performance guide.