depends where/how you store the “checked numbers”

could store numbers as a list on the bingo card (data)
could store numbers as a separate data type and then list those number datas on the bingo card data (gives you ability to have bingo based on row/column combos)
store the selected in a state on the page either as numbers or number datas

states would be best since the game is likely short lived and fast paced (states are instant whereas database writes are a bit slower).

suggested data setup
simple version
bingo card - status (used/not used), created date, owned by user, numbers list, selected numbers list

more advanced scoring
bingo card - as above but numbers are now a separate data type
bingo number - card, number, row, column, selected y/n

having a bingo number data type allows you to explicitly assign a column and row to each number which can be used later to figure out if all the numbers in 1 column are checked or not.

on page logic
use opens page
selects bingo card (could also create new here, random gen numbers, assign to user etc)
user clicks on numbers (these are in a repeating group)
each number is added/removed from a state on the page or written back to database (state likely better here)
use state list of numbers vs bingo list of numbers to evaluate conditions for won/lost/button clickable etc

simple simple version
don’t write the selected numbers back to database and instead just recycle the bingo card
hold the selected numbers as a state on the page still
don’t own the bingo card by a user, instead just count won/lost on user data

if bingo cards are owned by the user then to get the users win rate you’d search bingo cards owned by user :sum

otherwise a simple +/- on each win would be fine for simple logic