2017-01-07 1 views
0

J'essaye de concevoir une famille de colonnes dans Cassandra mais j'ai quelques doutes sur la clé primaire/partition.
Ce que je veux est la suivante:Cassandra, partition/clé primaire: partitionnement et contrainte

  • données Étendre uniformément autour du cluster
  • Réduire le nombre de partitions lu

Je sais que ces objectifs sont réalisables en choisissant la partition appropriée/primaire key, mais supposons que la partition/clé primaire choisie autorise des données invalides dans votre famille colum, que faites-vous?

Supposons que j'ai la Colum familiale suivante:

CREATE TABLE group (
    groupname text, 
    username text, 
    PRIMARY KEY (groupname, username)) 

Supposons qu'un nom d'utilisateur doit appartenir uniquement dans un groupe, avec cette clé primaire, je peux obtenir (avec une hypothèse) les objectifs précédents , mais il n'y a aucun moyen d'éviter qu'un nom d'utilisateur soit placé dans plus d'un groupe. Puis-je simplement faire une supposition sur ce qui sera dans la famille de colonnes ou y a-t-il des façons d'éviter l'insertion de données invalides?

+0

Il n'est pas possible de c reate l'équivalent RDBMS d'une "contrainte" dans Cassandra. Si vous devez vous assurer que les données non valides ne sont pas écrites, vous devrez vérifier cela au niveau de l'application. – Aaron

Répondre

2

Déclarant une table avec nom d'utilisateur comme clé primaire assurera une seule relation nom d'utilisateur à un groupe existe:

CREATE TABLE group (username text, groupname text, PRIMARY KEY (username)); 

Avec lightweight transactions vous pouvez empêcher les mises à jour au groupe d'un utilisateur:

INSERT INTO group (username, groupname) VALUES ('joe', 'wheel') IF NOT EXISTS; 

Si vous souhaitez interroger par groupe, créez une vue matérialisée:

CREATE MATERIALIZED VIEW usersbygroup AS 
    SELECT groupname, username FROM group 
PRIMARY KEY (groupname, username); 
+0

En ce jour j'ai essayé ce que tu m'as dit et ça semble être une bonne solution, merci! – LolloFake