2017-03-06 2 views
2

Folks, Je voudrais résoudre ce qui suit avec une table à Cassandra. Lesdites pistes de service lorsque les utilisateurs ouvrent un actif. Lors d'événements ultérieurs sur le même actif, nous écrasons simplement accessDate.Cassandra Schema pour la récupération des enregistrements de date

exemple enregistrement:

{userId: "string", assetId: "string", accessdate: unixTimestamp}

Ceci dit, nous devons remplir les conditions d'accès suivantes (chaque l'exigence a sa propre puce pour la lisibilité):

  • Etre capable de renvoyer tous les actifs qu'un utilisateur a ouverts et à quelle heure.

Ceci est facile à réaliser, table pourrait ressembler à:

CREATE TABLE user_assets_tracker (
    userId uuid, 
    accessDate timestamp, 
    assetId uuid, 
    PRIMARY KEY (userid, accessDate, assetId) 
); 

Cela nous permet d'interroger l'ensemble des actifs, et quand chacun était la dernière fois.

SELECT * 
FROM user_assets_tracker 
WHERE userId = 522b1fe2-2e36-4cef-a667-cd4237d08b89 
ORDER BY accessDate DESC; 
> 

Dandy. Maintenant, les choses les plus difficiles, dont je ne suis pas sûr, espéraient que les gens pourraient intervenir:

  • Montrez-moi tous les éléments ajoutés au cours des 30 derniers jours.

Naturellement, la limite n'est pas ce dont nous avons besoin. En outre, nous pouvons avoir besoin de 2 tables pour y parvenir.

SELECT * 
FROM user_assets_tracker 
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 
ORDER BY accessDate DESC; 
LIMIT 10; ????? 
  • Montrez-moi le dernier élément accessible pour l'utilisateur. Je pense que celui-ci est plus facile, le LIMIT 1 résout cela.

Ceci est probablement avant droit, avec ce schéma:

CREATE TABLE user_assets_tracker (
    userId uuid, 
    accessDate timestamp, 
    assetId uuid, 
    PRIMARY KEY (userid, accessDate, assetId) 
); 

SELECT * 
FROM user_assets_tracker 
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 
ORDER BY accessDate DESC; 
LIMIT 1; 
  • Extrayez la fiche complète pour un userId particulier + assetId

Depuis accessdate vient avant assetId dans notre schéma, Je ne suis pas sûr de savoir comment faire cela aussi. Une autre table?

Merci!

PS Il semble que SASI Index pourrait être la solution

Répondre

2

Bien que vous choisissez toujours AssetID orderby accessdate desc.
Définir votre schéma avec commande par accessdate desc

CREATE TABLE user_assets_tracker (
    userid uuid, 
    accessdate timestamp, 
    assetid uuid, 
    PRIMARY KEY (userid, accessdate, assetid) 
) WITH CLUSTERING ORDER BY (accessdate DESC, assetid ASC); 

Maintenant, vous n'avez pas besoin de spécifier l'ordre par accessdate desc chaque fois.il va par défaut ordonner vos données par accessDate desc

  • Afficher tous les éléments ajoutés dans les 30 derniers jours.

Première obtenir l'horodatage d'il ya 30 jours.
Soit l'horodatage actuel il y a 30 jours est: 2017-02-05 12:00:00+0000
Maintenant, vous pouvez interroger:

SELECT * FROM user_assets_tracker WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND accessdate >= '2017-02-05 12:00:00+0000' 
  • Récupérer la fiche complète pour un userId particulier + assetId

Si vous utilisez Cassandra 3.0 ou ci-dessus, vous pouvez utiliser Materialized Views
CREER une Vue matérialisée:

CREATE MATERIALIZED VIEW user_assets AS 
    SELECT * 
    FROM user_assets_tracker 
    WHERE userid IS NOT NULL AND assetid IS NOT NULL AND accessdate IS NOT NULL 
    PRIMARY KEY (userid, assetid, accessdate); 

Maintenant, si vous voulez obtenir toutes les données avec UserID et AssetID, voici la requête

SELECT * FROM user_assets WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND assetid = 1d45e6c2-02a1-11e7-aac5-b9ab92bee74c; 

Voici une autre chose, si énorme données sont insérées dans un seul utilisateur, vous devez ajouter un seau de temps avec userid comme clé de partition.Pour plus vérifier la réponse https://stackoverflow.com/a/41857183/2320144

+0

MERCI BEAUCOUP! Question rapide, je vois que dans le premier exemple vous avez (userid, accessdate, assetid), mais dans la seconde vous avez (userid, assetid, accessdate); Comment la requête unique fonctionnera-t-elle alors? – Cmag