Cassandra Μοντέλο δεδομένων με Παράδειγμα απλής βάσης δεδομένων
⚡ Έξυπνη Σύνοψη
Cassandra Οι κανόνες του μοντέλου δεδομένων αντιστρέφουν τις συνήθειες του σχεσιακού σχεδιασμού: οι πίνακες κατασκευάζονται για ερωτήματα και όχι για οντότητες. Αυτή η σελίδα καλύπτει τους βασικούς κανόνες, την επιλογή κλειδιού διαμέρισης και τα λειτουργικά σχήματα για σχέσεις ένα-προς-ένα, ένα-προς-πολλά και πολλά-προς-πολλά.

Αν και Cassandra η γλώσσα ερωτημάτων μοιάζει SQL γλώσσα, οι μέθοδοι μοντελοποίησης δεδομένων τους είναι τελείως διαφορετικές.
In Cassandra, ένα κακό μοντέλο δεδομένων μπορεί να υποβαθμίσει την απόδοση, ειδικά όταν οι χρήστες προσπαθούν να εφαρμόσουν τις έννοιες του RDBMS Cassandra. Είναι καλύτερο να έχετε υπόψη μερικούς κανόνες που περιγράφονται παρακάτω.
Cassandra Κανόνες μοντέλου δεδομένων
In Cassandra, τα γράφει δεν είναι ακριβά. Cassandra δεν υποστηρίζει συνδέσεις, ομαδοποίηση κατά, ρήτρα Ή, συναθροίσεις κ.λπ. Επομένως, πρέπει να αποθηκεύσετε τα δεδομένα σας με τέτοιο τρόπο ώστε να είναι πλήρως ανακτήσιμα. Επομένως, αυτοί οι κανόνες πρέπει να λαμβάνονται υπόψη κατά τη μοντελοποίηση δεδομένων Cassandra.
Μεγιστοποιήστε τον αριθμό των εγγραφών
In Cassandra, γράφει είναι πολύ φθηνά. Cassandra είναι βελτιστοποιημένο για υψηλή απόδοση εγγραφής. Προσπαθήστε λοιπόν να μεγιστοποιήσετε τις εγγραφές σας για καλύτερη απόδοση ανάγνωσης και διαθεσιμότητα δεδομένων. Υπάρχει μια αντιστάθμιση μεταξύ εγγραφής και ανάγνωσης δεδομένων. Επομένως, βελτιστοποιήστε την απόδοση ανάγνωσης δεδομένων μεγιστοποιώντας τον αριθμό των εγγραφών δεδομένων.
Μεγιστοποίηση της αντιγραφής δεδομένων
Η αποκανονικοποίηση δεδομένων και η αντιγραφή δεδομένων είναι defacto Cassandra. Ο χώρος στο δίσκο δεν είναι πιο ακριβός από τη μνήμη, την επεξεργασία της CPU και τη λειτουργία IO. Ως Cassandra είναι μια κατανεμημένη βάση δεδομένων, επομένως η αντιγραφή δεδομένων παρέχει άμεση διαθεσιμότητα δεδομένων και κανένα σημείο αποτυχίας.
Cassandra Στόχοι Μοντελοποίησης Δεδομένων
Θα πρέπει να έχετε τους ακόλουθους στόχους κατά τη μοντελοποίηση δεδομένων Cassandra:
Διαδώστε τα δεδομένα ομοιόμορφα γύρω από το Cluster
Θέλετε ίση ποσότητα δεδομένων σε κάθε κόμβο του Cassandra ClusterΤα δεδομένα κατανέμονται σε διαφορετικούς κόμβους με βάση τα κλειδιά διαμέρισης που αποτελούν το πρώτο μέρος του πρωτεύοντος κλειδιού. Επομένως, προσπαθήστε να επιλέξετε μια στήλη υψηλής πληθικότητας ως κλειδί διαμέρισης για την ομοιόμορφη κατανομή των δεδομένων σε όλο το σύμπλεγμα.
Ελαχιστοποιήστε τον αριθμό των κατατμήσεων που διαβάζονται κατά την αναζήτηση δεδομένων
Το διαμέρισμα είναι μια ομάδα εγγραφών με το ίδιο κλειδί διαμερίσματος. Όταν εκδίδεται το ερώτημα ανάγνωσης, συλλέγει δεδομένα από διαφορετικούς κόμβους από διαφορετικά διαμερίσματα.
Εάν θα υπάρχουν πολλά διαμερίσματα, τότε όλα αυτά τα διαμερίσματα πρέπει να επισκεφθείτε για τη συλλογή των δεδομένων ερωτήματος.
Αυτό δεν σημαίνει ότι δεν πρέπει να δημιουργούνται διαμερίσματα. Εάν τα δεδομένα σας είναι πολύ μεγάλα, δεν μπορείτε να διατηρήσετε αυτήν την τεράστια ποσότητα δεδομένων στο ένα διαμέρισμα. Το ένα διαμέρισμα θα επιβραδυνθεί.
Προσπαθήστε λοιπόν να επιλέξετε έναν ισορροπημένο αριθμό κατατμήσεων.
Καλό πρωτεύον κλειδί Cassandra
Και οι δύο παραπάνω στόχοι καταλήγουν σε μία απόφαση, επομένως τα δύο παρακάτω σχήματα δείχνουν τον ίδιο πίνακα με ένα κακό κλειδί και ένα σωστό.
Ας πάρουμε ένα παράδειγμα και ας βρούμε ποιο πρωτεύον κλειδί είναι καλό.
Εδώ είναι ο πίνακας MusicPlaylist.
CREATE TABLE MusicPlaylist ( SongId int, SongName text, Year int, Singer text, PRIMARY KEY (SongId, SongName) );
Στο παραπάνω παράδειγμα, πίνακας MusicPlaylist,
- Το SongId είναι το κλειδί διαμέρισης και
- Το SongName είναι η στήλη ομαδοποίησης
- Τα δεδομένα θα ομαδοποιηθούν με βάση το SongName. Θα δημιουργηθεί μόνο ένα partition ανά SongId και, επειδή κάθε τραγούδι έχει ένα ξεχωριστό αναγνωριστικό, κάθε partition περιέχει μία μόνο γραμμή.
Η ανάκτηση δεδομένων θα είναι αργή από αυτό το μοντέλο δεδομένων λόγω του κακού πρωτεύοντος κλειδιού.
Εδώ είναι ένα άλλο τραπέζι MusicPlaylist.
CREATE TABLE MusicPlaylist ( SongId int, SongName text, Year int, Singer text, PRIMARY KEY ((SongId, Year), SongName) );
Στο παραπάνω παράδειγμα, πίνακας MusicPlaylist,
- Τα SongId και Year είναι το κλειδί διαμέρισης, και
- Το SongName είναι η στήλη ομαδοποίησης.
- Τα δεδομένα θα ομαδοποιηθούν με βάση το SongName. Σε αυτόν τον πίνακα, κάθε χρόνο, θα δημιουργείται ένα νέο διαμέρισμα. Όλα τα τραγούδια της χρονιάς θα είναι στον ίδιο κόμβο. Αυτό το πρωτεύον κλειδί θα είναι πολύ χρήσιμο για τα δεδομένα.
Η ανάκτηση δεδομένων μας θα είναι γρήγορη από αυτό το μοντέλο δεδομένων.
Μοντελοποίηση των δεδομένων σας Cassandra
Κατά τη μοντελοποίηση των ερωτήσεών σας πρέπει να έχετε υπόψη σας τα ακόλουθα:
Προσδιορίστε ποια ερωτήματα θέλετε να υποστηρίξετε
Πρώτα απ 'όλα, καθορίστε ποια ερωτήματα θέλετε.
Για παράδειγμα, χρειάζεστε;
- Ενώνει
- Ομαδοποίηση από
- Φιλτράρισμα σε ποια στήλη κ.λπ.
Δημιουργήστε πίνακα σύμφωνα με τα ερωτήματά σας
Δημιουργήστε πίνακα σύμφωνα με τα ερωτήματά σας. Δημιουργήστε έναν πίνακα που θα ικανοποιήσει τις απορίες σας. Προσπαθήστε να δημιουργήσετε έναν πίνακα με τέτοιο τρόπο ώστε να χρειάζεται να διαβαστεί ένας ελάχιστος αριθμός κατατμήσεων.
Οι τρεις ενότητες που ακολουθούν εφαρμόζουν αυτήν την αρχή στους τρεις τύπους σχέσεων που βρίσκονται σχεδόν σε κάθε σχήμα.
Χειρισμός μιας προς ένα σχέσης Cassandra
Σχέση ένα προς ένα σημαίνει ότι δύο πίνακες έχουν μία προς μία αντιστοιχία. Για παράδειγμα, ο φοιτητής μπορεί να εγγράψει μόνο ένα μάθημα και θέλω να ψάξω σε έναν μαθητή σε ποιο μάθημα είναι εγγεγραμμένος ένας συγκεκριμένος φοιτητής.
Έτσι, σε αυτήν την περίπτωση, το σχήμα του πίνακα θα πρέπει να περιλαμβάνει όλα τα στοιχεία του μαθητή που αντιστοιχούν στο συγκεκριμένο μάθημα, όπως το όνομα του μαθήματος, τον αριθμό του μαθητή, το όνομα του μαθητή κ.λπ.

Το παραπάνω διάγραμμα δείχνει έναν μόνο πίνακα που εξυπηρετεί το ερώτημα, επειδή ένας φοιτητής αντιστοιχεί σε ακριβώς ένα μάθημα.
CREATE TABLE Student_Course ( Student_rollno int PRIMARY KEY, Student_name text, Course_name text );
Επειδή το Student_rollno είναι το κλειδί του διαμερίσματος, μια αναζήτηση με βάση τον αριθμό καταχώρησης διαβάζει ακριβώς ένα διαμέρισμα.
Χειρισμός μιας προς πολλούς σχέσης Cassandra
Ένα προς πολλές σχέσεις σημαίνει ότι υπάρχει μία προς πολλές αντιστοιχίες μεταξύ δύο πινάκων.
Για παράδειγμα, ένα μάθημα μπορεί να μελετηθεί από πολλούς φοιτητές. Θέλω να ψάξω όλους τους φοιτητές που σπουδάζουν ένα συγκεκριμένο μάθημα.
Έτσι, ερωτώντας το όνομα του μαθήματος, θα έχω πολλά ονόματα μαθητών που θα σπουδάσουν ένα συγκεκριμένο μάθημα.

Εδώ, το όνομα του μαθήματος γίνεται το κλειδί διαμέρισης, έτσι ώστε κάθε μαθητής σε ένα μάθημα να καταλήγει στο ίδιο διαμέρισμα, και ο αριθμός κύλισης γίνεται η στήλη ομαδοποίησης, έτσι ώστε κάθε μαθητής να παραμένει μια ξεχωριστή σειρά.
CREATE TABLE Student_Course ( Course_name text, Student_rollno int, Student_name text, PRIMARY KEY (Course_name, Student_rollno) );
Μπορώ να ανακτήσω όλους τους μαθητές για ένα συγκεκριμένο μάθημα με το ακόλουθο ερώτημα.
SELECT * FROM Student_Course WHERE Course_name = 'Course Name';
Χειρισμός πολλών προς πολλούς σχέσεων Cassandra
Πολλές έως πολλές σχέσεις σημαίνει να έχετε πολλές έως πολλές αντιστοιχίες μεταξύ δύο πινάκων.
Για παράδειγμα, ένα μάθημα μπορεί να μελετηθεί από πολλούς μαθητές και ένας μαθητής μπορεί επίσης να μελετήσει πολλά μαθήματα.

Θέλω να ψάξω όλους τους φοιτητές που σπουδάζουν ένα συγκεκριμένο μάθημα. Επίσης, θέλω να ψάξω όλο το μάθημα που σπουδάζει ένας συγκεκριμένος φοιτητής.
Έτσι, σε αυτήν την περίπτωση, θα έχω δύο πίνακες, δηλαδή θα χωρίσω το πρόβλημα σε δύο περιπτώσεις. Αυτή είναι η πιο ξεκάθαρη απεικόνιση του κανόνα της επανάληψης: τα ίδια δεδομένα γράφονται δύο φορές, έτσι ώστε κάθε ερώτημα να διαβάζει ένα partition.
Αρχικά, θα δημιουργήσω έναν πίνακα με τον οποίο μπορείτε να βρείτε μαθήματα από έναν συγκεκριμένο μαθητή.
CREATE TABLE Student_Course ( Student_rollno int, Course_name text, Student_name text, PRIMARY KEY (Student_rollno, Course_name) );
Μπορώ να βρω όλα τα μαθήματα ενός συγκεκριμένου μαθητή με το παρακάτω ερώτημα.
SELECT * FROM Student_Course WHERE Student_rollno = 101;
Δεύτερον, θα δημιουργήσω έναν πίνακα με τον οποίο μπορείτε να βρείτε πόσοι μαθητές σπουδάζουν ένα συγκεκριμένο μάθημα.
CREATE TABLE Course_Student ( Course_name text, Student_rollno int, Student_name text, PRIMARY KEY (Course_name, Student_rollno) );
Μπορώ να βρω έναν φοιτητή σε ένα συγκεκριμένο μάθημα με το ακόλουθο ερώτημα.
SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';
Και οι δύο πίνακες πρέπει να γράφονται κάθε φορά που ένας φοιτητής εγγράφεται σε ένα μάθημα, συνήθως μέσα σε μία μόνο καταγεγραμμένη παρτίδα, έτσι ώστε τα δύο αντίγραφα να παραμένουν σε βήμα.
Κοινός Cassandra Λάθη στη μοντελοποίηση δεδομένων
Τα περισσότερα κακά σχήματα επαναλαμβάνουν την ίδια χούφτα λαθών, και το καθένα tracεπιστρέφει σε μια συνήθεια που μεταφέρθηκε από τον σχεσιακό σχεδιασμό.
- Απεριόριστα διαμερίσματα: Η επιλογή ενός κλειδιού διαμέρισης, όπως το όνομα μιας χώρας, τοποθετεί εκατομμύρια γραμμές σε ένα διαμέρισμα. Προσθέστε ένα χρονικό πλαίσιο, για παράδειγμα (χώρα, μήνας), για να διατηρήσετε τα διαμερίσματα σε ένα λογικό μέγεθος.
- Κλειδιά πολύ χαμηλής πληθικότητας: Ένα κλειδί διαμέρισης με μόνο λίγες πιθανές τιμές, όπως μια σημαία κατάστασης, συγκεντρώνει όλη την κίνηση σε λίγους κόμβους και αφήνει τους υπόλοιπους αδρανείς.
- Χρησιμοποιώντας την επιλογή ALLOW FILTERING για να λειτουργήσει ένα ερώτημα: Σαρώνει κάθε διαμέρισμα και αποκρύπτει ένα πρόβλημα μοντελοποίησης. Εάν ένα ερώτημα το χρειάζεται, το σχήμα χρειάζεται έναν άλλο πίνακα.
- Μοντελοποίηση οντοτήτων αντί για ερωτήματα: Η δημιουργία ενός πίνακα μαθητών και ενός πίνακα μαθημάτων και, στη συνέχεια, η προσπάθεια ένταξής τους στην εφαρμογή ακυρώνει τον σκοπό του σχεδιασμού.
- Συχνές διαγραφές και αντικαταστάσεις: Κάθε διαγραφή γράφει μια επιτύμβια στήλη (tombstone) που πρέπει να διαβαστεί και να παραλειφθεί μέχρι να την αφαιρέσει η συμπύκνωση, γεγονός που επιβραδύνει τις αναγνώσεις σε θερμά διαμερίσματα (hot partitions).
Η αποφυγή αυτών διατηρεί το σχήμα ευθυγραμμισμένο με τους κανόνες που αναφέρονται στην κορυφή αυτής της σελίδας και με τις σχεσιακές αντιθέσεις που συνοψίζονται παρακάτω.
Διαφορά μεταξύ RDBMS και Cassandra Μοντελοποίηση δεδομένων
| RDBMS | Cassandra |
|---|---|
| Αποθηκεύει δεδομένα σε κανονικοποιημένη μορφή | Αποθηκεύει δεδομένα σε αποκανονική μορφή |
| dbms παλαιού τύπου; δομημένα δεδομένα | Ευρεία αποθήκευση γραμμών, δυναμική· δομημένα και μη δομημένα δεδομένα |
| Το σχήμα σχεδιάζεται γύρω από οντότητες και τις σχέσεις τους | Το σχήμα έχει σχεδιαστεί γύρω από τα ερωτήματα που θα εκτελέσει η εφαρμογή |
| Υποστηρίζονται οι όροι Joins, GROUP BY και τυχαίοι όροι WHERE | Δεν απαιτούνται ενώσεις ή αυθαίρετο φιλτράρισμα. Τα ερωτήματα πρέπει να ταιριάζουν με το πρωτεύον κλειδί. |
| Ένας πίνακας συνήθως εξυπηρετεί πολλά διαφορετικά ερωτήματα | Ένας πίνακας συνήθως εξυπηρετεί ένα ερώτημα, επομένως τα δεδομένα αντιγράφονται σε όλους τους πίνακες |
| Ακεραιότητα αναφοράς που επιβάλλεται από ξένα κλειδιά | Δεν υπάρχουν ξένα κλειδιά. Η συνέπεια μεταξύ των διπλότυπων πινάκων είναι ευθύνη της εφαρμογής. |
Αυτές οι αποφάσεις σχήματος εφαρμόζονται στην πράξη στο Cassandra τραπέζι και keyspace Μαθήματα.
