Question

Je veux faire une requête pour deux familles de colonnes à la fois ... J'utilise la gemme cassandra-cql pour les rails et mes familles de colonnes sont:

utilisateurs
suivant
abonnés
user_count
message_count
messages

Je souhaite maintenant recevoir tous les messages des personnes qu'un utilisateur suit.Existe-t-il une sorte de multiget avec cassandra-cql ou existe-t-il une autre possibilité en changeant le modèle de données pour obtenir ce type de données?

Était-ce utile?

La solution

J'appellerais votre modèle de données actuel une entité / conception relationnelle traditionnelle. Cela aurait du sens à utiliser avec une base de données SQL. Lorsque vous disposez d'une base de données relationnelle, vous comptez sur des jointures pour créer vos vues qui couvrent plusieurs entités.

Cassandra n'a aucune capacité d'effectuer des jointures. Ainsi, au lieu de modéliser vos données en fonction de vos entités et relations, vous devez les modéliser en fonction de la façon dont vous avez l'intention de les interroger. Pour votre exemple de `` tous les messages des personnes qu'un utilisateur suit '', vous pouvez avoir une famille de colonnes où la clé de ligne est l'ID utilisateur et les colonnes sont tous les messages des personnes que l'utilisateur suit (où le nom de la colonne est un horodatage + ID utilisateur et la valeur est le message):

RowKey                              Columns
-------------------------------------------------------------------
|        | TimeStamp0:UserA | TimeStamp1:UserB | TimeStamp2:UserA |
| UserID |------------------|------------------|------------------|
|        | Message          | Message          | Message          |
-------------------------------------------------------------------

Vous voudrez probablement aussi une famille de colonnes avec tous les messages qu'un utilisateur spécifique a écrits (je suppose que le message est diffusé à tous les utilisateurs au lieu d'être adressé à un utilisateur particulier):

RowKey                   Columns
--------------------------------------------------------
|        | TimeStamp0 | TimeStamp1 | TimeStamp2        |
| UserID |------------|------------|-------------------|
|        | Message    | Message    | Message           |
--------------------------------------------------------

Désormais, lorsque vous créez un nouveau message, vous devrez l'insérer à plusieurs endroits. Mais lorsque vous avez besoin de lister tous les messages des personnes qu'un utilisateur suit, il vous suffit de récupérer une ligne (ce qui est rapide).

Évidemment, si vous supportez la mise à jour ou la suppression des messages, vous devrez le faire partout où il y a une copie du message. Vous devrez également considérer ce qui devrait se passer lorsqu'un utilisateur suit ou se désabonne quelqu'un. Il existe plusieurs solutions à ce problème et votre solution dépendra de la manière dont vous souhaitez que votre application se comporte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top