REF
vs ENUM BaseType REF
๐ง โA real-world checklist for app performance and architectureโ
Hi everyone,
I've been experimenting with AppSheet at scale, optimizing my apps for performance across multiple modules, and Iโve been questioning one core concept:
Should I always use
REF
columns, or are there cases whereENUM
with BaseTypeREF
is better?
Let me say this upfront โ I'm not here to go against the tide. I'm here to bring data, testing, and real-life comparison to the table.
So I created this checklist to help choose intentionally, not blindly.
REF
or ENUM REF
[Related_*]
virtual column?โ
Yes โ Use REF
โ No โ Consider ENUM REF
That virtual column recalculates every sync โ powerful if used, wasteful if ignored.
โ
Yes โ REF
will make your life easier
โ No, I prefer full manual control โ ENUM REF
is fine
AppSheet gives you free UX enhancements with
REF
.ENUM REF
requires extra work.
โ
Yes โ ENUM REF
can drastically improve sync speed
โ No โ REF
is fine
REF
adds hidden cost during sync via[Related_*]
recalculations.
โ
Yes โ Stick with REF
โ No โ You can replace it with bots when using ENUM REF
โ
Yes โ ENUM REF
allows much more flexible modeling
โ No, it's a classic one-to-many โ REF
is cleaner
[RefCol].[Name]
?โ
Yes โ REF
is more efficient and native
โ No โ ENUM REF
works fine for structure only
โ
Yes โ ENUM REF
is usually the smarter choice
โ No โ Weigh the other points carefully
โ
Yes โ Go with ENUM REF
for full control
โ No โ Use REF
and let the platform help you
Situation | Use REF โ
|
Use ENUM REF โ
|
---|---|---|
Need [Related_*] |
โ | โ |
Use inline views / system actions | โ | โ |
Use IsPartOf / cascading delete |
โ | โ (requires bots) |
Optimize sync performance | โ | โ |
Table is read-only in this app | ๐ถ | โ |
One parent only | โ | ๐ถ |
Multi-parent model | ๐ถ | โ |
App has low row count | โ | โ (not worth it) |
REF
vs ENUM BaseType REF
in Real Time UXWhat would be the UX?
The user's experience when interacting with dropdowns (especially in forms).
Letโs get into it. ๐ฏ
REF
columnThe reference table is pre-loaded during the sync.
If thereโs no Valid If
, AppSheet just displays the full list โ super fast.
If there is a Valid If
, itโs evaluated at click time, but:
If it's simple ([Active]=TRUE
), it's instant.
If it's complex (FILTER(...)
or SELECT(...)
), it may introduce a slight delay.
โ The best practice: use a slice as the source โ the filtering is done once at sync, and then it loads instantly in the dropdown.
โ Result: Lightning-fast dropdown, even with lots of rows.
ENUM
with BaseType REF
You must define a Valid If
with a formula like:
FILTER("Products", [Active] = TRUE)
That formula is evaluated every single time the dropdown is opened.
Even if the data is synced, AppSheet treats it like a regular expression โ it doesnโt know it's part of a structural relationship.
So:
With a short list: all good.
With hundreds or thousands of rows: ๐ฌ noticeable lag.
Every dropdown click = new calculation.
โ Result: Smooth syncโฆ but UX latency at click time, especially with large datasets or complex filters.
Feature | REF |
ENUM BaseType REF |
---|---|---|
Data preloaded | โ Yes | โ No |
Response on dropdown click | โ Fast (especially with slice) | โ Can lag |
Calculation reuse | โ Slice is preprocessed | โ Re-evaluated each time |
Sync speed | โ Heavier | โ Light & fast |
Best for large tables | โ With slices | โ Risky for UX |
Best for read-only apps | โ Unnecessary | โ Excellent choice |
If you're feeling bold, try this hybrid pattern:
Create a hidden REF
column linked to a filtered slice for fast selection.
Use a visible Text
or Enum
field to store the selected value.
Populate it from the REF via an action or Initial Value logic.
This gives you fast dropdown performance while avoiding structural overhead.
This is not about REF vs ENUM REF.
This is about architecture vs automation.
If you're intentional, both tools are great โ as long as you take full ownership of the tradeoffs.
๐ In my case, Iโve decided to test both side by side โ building mirror apps โ to really feel the difference between sync time and click latency.
๐ Feel free to try the checklist above on your own builds, and let me know how it works for you.
Absolutely, Gustavo. Here's your post translated and polished for the AppSheet Community โ Tips & Tricks section, perfectly aligned to follow up your earlier article. You can copy-paste it right away.
This isnโt just about performance โ itโs about UX quality at the field level.
๐ So if your field lives in a form and points to lots of rows, use a REF
with a pre-filtered slice.
๐ If itโs used in read-only contexts or light apps โ ENUM REF
still shines.
Just keep this in mind:
โฑ๏ธ A slow sync is annoying,
๐ฑ๏ธ But a laggy click breaks flow.
I hope this helps you take one more step toward clean, scalable apps.
Thanks again for all the discussions that fuel this thinking โ Iโll keep testing and sharing!
Letโs elevate the way we architect in AppSheet.
Thanks for reading!
โ Gustavo๐ก
very useful tip. Thanks for sharing and thumbs up for your effort put into this ๐
Thank you so much for your comment @jyothis_m . We all grow together here!