Tengo una pregunta sobre el modelado de bases de datos en tiempo real

Tengo muchos datos sobre "usuarios" y me gustaría utilizar:

1.nodos como espacios de nombres como:

    /users/accounts/{ids}
    /users/profiles/{ids}
    /users/records/{ids}
  1. nodos raíz como:
    /usersaccounts/{ids}
    /usersprofiles/{ids}
    /usersrecords/{ids}

Para 1, me gustaría saber si los filtros funcionan en la referencia dada en la consulta o en todos los nodos '/users'.

Por ejemplo, quiero filtrar datos '/users/accounts' solo cuando sea necesario y no en todos los nodos '/users' para obtener datos filtrados 'accounts'.

¿Cuál es el mejor enfoque entre 1 y 2?

¿Qué pasa con el rendimiento?

Gracias de antemano

1
foboss 15 abr. 2020 a las 16:19

2 respuestas

La mejor respuesta

No hay una diferencia significativa entre los dos enfoques que describió. Ambos parecen modelar listas planas de una sola entidad, y si lo hace como un nivel superior o un nivel inferior no hace una diferencia significativa.

Lo que hace marca la diferencia es si anida diferentes tipos de entidades en un solo nodo dinámico.

/users/{ids}/accounts
/users/{ids}/profiles
/users/{ids}/records

En este modelo, solo puede obtener y asegurar el acceso de un usuario completo, en lugar de sus cuentas, perfiles y registros por separado. Esta es la razón por la cual la documentación de Firebase recomienda que evite anidar datos y aplanar estructuras de datos.

1
Frank van Puffelen 15 abr. 2020 a las 13:40

Si tiene esta base de datos:

users
  accounts
      randomId
           accNum: 1234
      randomId
           accNum: 1234
  profiles
      randomId
           profile: 124
      randomId
           profile :125

Use este esquema si cada nodo tendrá una gran cantidad de datos debajo, por lo que si profile o accounts tendrán muchos datos para cada usuario, entonces úselo. Además, si desea consultar datos dentro de accounts o dentro de profile, debe usar este esquema.

Por ejemplo:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
ref.child("accounts").orderByChild("accNum").equalTo(1234) //1
ref.child("profiles").orderByChild("profile").equalTo(124) //2

1- filtrará según accNum dentro de las cuentas

2- filtrará según el perfil dentro de los perfiles


Básicamente, tanto el primer como el segundo esquema están cerca uno del otro, pero si desea recuperar todo dentro del nodo users, use este esquema.

1
Peter Haddad 15 abr. 2020 a las 13:39