Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase data structure for iOS app with profiles and basic gamification

I am currently building out my iOS 10 app with user profiles, which should hold certain achievements and experience points (similar system to StackOverflow). I have already built my Facebook Login, FIRAuth etc. At the moment I am thinking about the data structure of Firebase's DB. I have read through the Firebase Guide for flat data structures and some general Firebase data guides like the one from Ray Wenderlich.

This is what users can already do:

  • login with Facebook (...) and get picture, name etc. (already handled via FIRAuth)
  • visit a profile page, which shows their name and profile picture (already handled in a ProfileViewController)

This is my to-do list:

  • basic achievements via badges/titles similarly to StackExchange/StackOverflow e.g. user has done action XY 20 times => badge for 20 times for action XY; I was thinking of either:

    a) having an array/list in each of the users' profile, which holds all of the gathered badges (as strings) OR

    b) having a single boolean var for each achievement within the user profiles

  • a second achievements tracker, which tracks the general usage of the app - something like a levelling system in RPG games with experience points so just an Int value for every profile in terms of the DB

My question:

How would you combine the FIRAuth profiles with the database to hold the aforementioned badges (could be up-to 50-60 achievements) and the separate levels/xp points of the users?

Keep in mind that I am new to the modelling of JSON DBs. I don't want a solution in terms of code etc. for the functions in question - just a helping hand for the data structure of the user profiles.

I would also be looking into the extension of the user profiles in the future (messaging etc.) and I should be able to send notifications to all users who have certain levels/achievements in the future (and this makes me lean towards b)) - so too much nesting is out of the question already.

like image 583
tech4242 Avatar asked Jul 02 '26 15:07

tech4242


1 Answers

Using the structure below, you can retrieve a particular user's achievements by observing the children of the user's achievements path. However this only get's you the keys of the achievements.

Given you have a user with the uid 1j6Ft1BT30TFG403obvGfjOHE4th, for each child in user-achievements/1j6Ft1BT30TFG403obvGfjOHE4th, you can use the child keys to observe the value of each achievement at achievements/-KQpsPExLsKdnVHMliiP.

{
    "users": {
        "1j6Ft1BT30TFG403obvGfjOHE4th": {
            "username": "john"
        }
    },
    "user-achievements": {
        "1j6Ft1BT30TFG403obvGfjOHE4th": {
            "-KQpsPExLsKdnVHMliiP": true
        }
    },
    "achievements": {
        "-KQpsPExLsKdnVHMliiP": {
            //
        }
    }
}
like image 70
Callam Avatar answered Jul 05 '26 04:07

Callam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!