Prisma orderBy na nullable sloupci řadí NULL poslední — „unread first" je obráceně
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Dropdown notifikací (zvoneček) neukazuje nejnovější položky nahoře. Nepřečtené notifikace, které měly být první, jsou naopak dole; přečtené položky jsou v „náhodném” pořadí. Po pollingu (periodický refetch seznamu) položky pod rukama uživatele přeskakují.
Root cause
Sekce “Root cause”Záměr byl „nepřečtené první, pak od nejnovější”:
orderBy: [ { readAt: "asc" }, // unread (null) first ← komentář lže { createdAt: "desc" },]Dva problémy:
- PostgreSQL řadí NULL při
ASCjako POSLEDNÍ (defaultNULLS LAST). Nepřečtené záznamy (readAt = NULL) tedy skončí na konci, ne na začátku — přesný opak záměru v komentáři. - Primární klíč
readAt ascznamená, že přečtené záznamy se řadí podle okamžiku přečtení, ne podle vytvoření —createdAt descse uplatní jen jako tiebreaker. Seznam tak není chronologický a klik na položku (nastavíreadAt) ji při dalším pollu přesune jinam.
Fix
Sekce “Fix”Řadit čistě časově; stav přečtení odlišovat vizuálně (barva/tečka), ne pořadím:
// předorderBy: [{ readAt: "asc" }, { createdAt: "desc" }]
// poorderBy: [{ createdAt: "desc" }, { id: "desc" }]Pokud je „unread first” opravdu požadavek, musí být NULL chování explicitní:
orderBy: [ { readAt: { sort: "asc", nulls: "first" } }, { createdAt: "desc" },]Jak to příště odhalit dřív
Sekce “Jak to příště odhalit dřív”- Test na pořadí seznamu s mixem NULL/ne-NULL hodnot v řadicím sloupci.
- Code review checklist: každé
orderByna nullable sloupci musí mít explicitnínulls. - Pozor na „mutující” řadicí klíče (readAt, updatedAt) u seznamů s pollingem — položky skáčou.