2011-11-01 5 views
3

(Je ne sais pas ce que son modèle appelé ... .. schéma .. super modèle?) CapteursCassandra: faire un modèle de données/schéma

je 'n' (unique a identifié) dans 'm' (uniquement id'd) maisons. Chacun de ces feux 0 à 'k' fois/jour (en blocs de 1-5). Ces données sont actuellement stockées dans MySQL avec une table pour chaque « maison » et une structure de:

time stamp 
sensor id 
firing count 

Im ayant du mal à envelopper mon esprit autour d'un modèle « NoSQL » de ces données qui me permettrait de trouver compte de tirs par la maison, le temps ou le capteur.

.. Ou peut-être ce n'est pas le bon type de données à pousser à nosql? Notre serveur actuel s'enlise sous la charge (des centaines de millions de lignes et des centaines de foyers). Je suis très intéressé à trouver un magasin de données qui permet l'évolutivité de Cassandra.

+0

Pourquoi vous avez une table séparée par maison au lieu d'une seule table et une clé étrangère? En outre, combien de mesures de capteurs recevez-vous par seconde, quelle est leur taille et quel type d'analyse avez-vous besoin d'effectuer? – user359996

Répondre

1

Pour stocker le tir comptage par le capteur et la maison:

House_Sensors  <-Column family 
    house_id  <-Key 
    sensor_id  <-Column name 
    firing_count <-Column value 

données représentées dans la notation JSON-ish

House_Sensors = { 
house_1 : { 
    sensor_1: 3436, 
    sensor_2: 46, 
    sensor_3: 99, 
    ... 
}, 
house_2 : { 
    sensor_7: 0, 
    sensor_8: 444, 
    ... 
}, 
... 
} 

Vous pouvez vouloir définir une autre famille de colonne avec sensor_id comme la clé pour stocker la mise à feu horodatage

Réfléchissez aux requêtes dont vous avez besoin lors de la conception du schéma et effectuez la dénormalisation au besoin. Répétez les données, les inserts Cassandra sont très rapides.

L'horodatage du tir n'est pas stocké dans la famille de colonnes House_Sensor. Créez une nouvelle famille de colonnes pour cela avec sensor_id comme clé. De cette façon, vous pouvez utiliser la famille House_Sensor pour interroger le nombre de tir et le capteur qui appartient à chaque maison. Utilisez l'autre famille de colonnes pour interroger l'horodatage de déclenchement.

+0

Donc, dans 'house_1', je peux avoir des coups de 20K de 'sensor_1' chacun avec un horodatage de quelque sorte? (Ce tampon serait fourni par le capteur et est indépendant de l'horodatage de Cassandra.) – ethrbunny

+0

Aussi - si j'ai une deuxième famille de colonnes, cela signifie-t-il que toutes les données sont stockées deux fois? – ethrbunny

+0

Si vous utilisez la deuxième famille de colonnes, cela signifie que toutes les données sont stockées deux fois. Votre question ne précise pas exactement comment vous devez lire les données, mais si la famille de seconde colonne utilise uniquement des horodatages pour les noms de colonne, un par tir (les valeurs peuvent être vides), cela vous permettra d'obtenir un nombre précis de tirs pour une plage de temps et un capteur donnés. Bien sûr, il s'agit d'une requête plus coûteuse que la lecture d'un seul compteur. –

2

Cela dépend. Pensez « Requête d'abord »:

  1. identifier les requêtes
  2. modèle les données

Ainsi, alors que vous pourriez avoir une famille de colonne qui est votre modèle physique, vous aurez également un ou plusieurs qui fournissent les données à mesure qu'elles sont interrogées. Et, vous pouvez en outre tirer parti des fonctionnalités Cassandra, telles que:

Les noms de colonne peuvent contenir des données. Vous n'avez pas besoin de stocker une valeur, chacun des noms peut être un horodatage, par exemple

Il est bien adapté pour stocker des milliers de colonnes pour chaque clé et les colonnes resteront triées et peuvent accéder à l'avant ou inverser l'ordre; Ainsi, pour continuer l'exemple ci-dessus, peut facilement obtenir la liste de tous les horodateurs pour un capteur

Les types de données composites vous permettent de combiner plusieurs bits de données en clés, noms ou valeurs. par exemple. combiner ID de maison et ID de capteur

Les colonnes de compteur fournissent un incrément de valeur simple, même pour la valeur initiale, donc toujours une opération d'écriture.

Les index peuvent être définis sur les noms de colonnes statiques qui, en effet, fournit une famille inverse de la colonne avec la clé que le résultat, juste faire attention de la taille du seau (par exemple, pourrait ne pas vouloir valeurs milliseconde)

Questions connexes