Cassandra โมเดลข้อมูลพร้อมตัวอย่างฐานข้อมูลอย่างง่าย
⚡ สรุปอย่างชาญฉลาด
Cassandra กฎของแบบจำลองข้อมูลจะกลับด้านธรรมเนียมการออกแบบเชิงสัมพันธ์: ตารางถูกสร้างขึ้นเพื่อการสืบค้นข้อมูลมากกว่าเพื่อเอนทิตี หน้านี้ครอบคลุมกฎหลัก การเลือกคีย์พาร์ติชัน และสคีมาที่ใช้งานได้จริงสำหรับความสัมพันธ์แบบหนึ่งต่อหนึ่ง หนึ่งต่อหลาย และหลายต่อหลาย

แม้ว่า Cassandra ภาษาการสอบถามคล้ายคลึงกับ SQL ภาษา วิธีการสร้างแบบจำลองข้อมูลแตกต่างกันโดยสิ้นเชิง
In Cassandraโมเดลข้อมูลที่ไม่ดีสามารถลดประสิทธิภาพได้ โดยเฉพาะเมื่อผู้ใช้พยายามนำแนวคิด RDBMS ไปใช้ Cassandra- ทางที่ดีควรคำนึงถึงกฎสองสามข้อที่มีรายละเอียดด้านล่าง
Cassandra กฎของโมเดลข้อมูล
In Cassandra, เขียนไม่แพง Cassandra ไม่สนับสนุนการรวม จัดกลุ่มตาม หรือส่วนคำสั่ง การรวม ฯลฯ ดังนั้นคุณต้องจัดเก็บข้อมูลของคุณในลักษณะที่สามารถเรียกคืนได้อย่างสมบูรณ์ ดังนั้นจึงต้องคำนึงถึงกฎเหล่านี้ในขณะที่สร้างแบบจำลองข้อมูล Cassandra.
เพิ่มจำนวนการเขียนสูงสุด
In Cassandra,เขียนถูกมาก Cassandra ระบบได้รับการปรับแต่งให้มีประสิทธิภาพการเขียนข้อมูลสูง ดังนั้นพยายามเพิ่มจำนวนการเขียนให้มากที่สุดเพื่อประสิทธิภาพการอ่านที่ดีขึ้นและความพร้อมใช้งานของข้อมูลที่ดีขึ้น มีความสมดุลระหว่างการเขียนข้อมูลและการอ่านข้อมูล ดังนั้นควรเพิ่มประสิทธิภาพการอ่านข้อมูลโดยการเพิ่มจำนวนการเขียนข้อมูลให้มากที่สุด
เพิ่มการทำสำเนาข้อมูลให้สูงสุด
ความผิดปกติของข้อมูลและการทำซ้ำข้อมูลเป็นสิ่งที่ผิดปกติ Cassandraพื้นที่ดิสก์ไม่แพงกว่าหน่วยความจำ การประมวลผล CPU และการทำงานของ IO Cassandra เป็นฐานข้อมูลแบบกระจาย ดังนั้นการทำสำเนาข้อมูลจึงมีความพร้อมใช้งานของข้อมูลได้ทันทีและไม่มีความล้มเหลวจุดเดียว
Cassandra เป้าหมายการสร้างแบบจำลองข้อมูล
คุณควรมีเป้าหมายต่อไปนี้ขณะสร้างแบบจำลองข้อมูลใน Cassandra:
กระจายข้อมูลอย่างเท่าเทียมกันรอบ ๆ Cluster
คุณต้องการข้อมูลจำนวนเท่ากันในแต่ละโหนดของ Cassandra Clusterข้อมูลจะถูกกระจายไปยังโหนดต่างๆ โดยอาศัยคีย์พาร์ติชัน ซึ่งเป็นส่วนแรกของคีย์หลัก ดังนั้น ควรเลือกคอลัมน์ที่มีค่าความหลากหลายสูง (high-cardinality column) เป็นคีย์พาร์ติชัน เพื่อกระจายข้อมูลอย่างสม่ำเสมอทั่วทั้งคลัสเตอร์
ลดจำนวนพาร์ติชันที่อ่านขณะสืบค้นข้อมูล
พาร์ติชั่นคือกลุ่มของเรคคอร์ดที่มีคีย์พาร์ติชั่นเดียวกัน เมื่อมีการออกแบบสอบถามการอ่าน จะรวบรวมข้อมูลจากโหนดที่แตกต่างกันจากพาร์ติชันที่แตกต่างกัน
หากมีพาร์ติชันจำนวนมาก จำเป็นต้องไปที่พาร์ติชันเหล่านี้ทั้งหมดเพื่อรวบรวมข้อมูลการสืบค้น
นั่นไม่ได้หมายความว่าไม่ควรสร้างพาร์ติชัน หากข้อมูลของคุณมีขนาดใหญ่มาก คุณไม่สามารถเก็บข้อมูลจำนวนมหาศาลนั้นไว้ในพาร์ติชันเดียวได้ พาร์ติชันเดียวจะทำให้การทำงานช้าลง
ดังนั้นลองเลือกจำนวนพาร์ติชั่นที่สมดุล
คีย์หลักที่ดีเข้า Cassandra
เป้าหมายทั้งสองข้างต้นล้วนขึ้นอยู่กับการตัดสินใจเพียงครั้งเดียว ดังนั้นแผนผังสองแบบด้านล่างจึงแสดงตารางเดียวกัน โดยมีคีย์ที่ไม่ดีและคีย์ที่ถูกต้อง
ลองยกตัวอย่างและหาดูว่าคีย์หลักแบบไหนเหมาะสมที่สุด
นี่คือตาราง MusicPlaylist
CREATE TABLE MusicPlaylist ( SongId int, SongName text, Year int, Singer text, PRIMARY KEY (SongId, SongName) );
ในตัวอย่างข้างต้น ตาราง MusicPlaylist
- SongId คือคีย์พาร์ติชั่น และ
- SongName คือคอลัมน์การจัดคลัสเตอร์
- ข้อมูลจะถูกจัดกลุ่มตามชื่อเพลง โดยจะสร้างพาร์ติชันเพียงหนึ่งพาร์ติชันต่อรหัสเพลงหนึ่งรหัส และเนื่องจากแต่ละเพลงมีตัวระบุที่ไม่ซ้ำกัน ดังนั้นแต่ละพาร์ติชันจึงมีเพียงแถวเดียว
การดึงข้อมูลจะช้าโดยโมเดลข้อมูลนี้เนื่องจากคีย์หลักไม่ถูกต้อง
นี่คือตาราง 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
ความสัมพันธ์แบบหลายต่อมากหมายถึงการมีความสัมพันธ์กันหลายต่อมากระหว่างสองตาราง
ตัวอย่างเช่น นักเรียนหลายคนสามารถเรียนหลักสูตรหนึ่งได้ และนักเรียนหนึ่งคนก็สามารถเรียนหลายหลักสูตรได้เช่นกัน

ฉันต้องการค้นหานักเรียนทุกคนที่กำลังเรียนหลักสูตรใดหลักสูตรหนึ่ง นอกจากนี้ ฉันต้องการค้นหาหลักสูตรทั้งหมดที่นักเรียนคนใดคนหนึ่งกำลังศึกษาอยู่
ดังนั้นในกรณีนี้ ฉันจะมีสองตาราง กล่าวคือแบ่งปัญหาออกเป็นสองกรณี นี่คือตัวอย่างที่ชัดเจนที่สุดของกฎการทำซ้ำ: ข้อเท็จจริงเดียวกันถูกเขียนซ้ำสองครั้งเพื่อให้แต่ละคำสั่งค้นหาอ่านพาร์ติชันเดียว
ขั้นแรก ฉันจะสร้างตารางที่คุณสามารถค้นหาหลักสูตรของนักเรียนคนใดคนหนึ่งได้
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 เพื่อให้การค้นหาทำงานได้: มันจะสแกนทุกพาร์ติชันและซ่อนปัญหาการสร้างแบบจำลองไว้ หากการสืบค้นต้องการข้อมูลนั้น โครงสร้างฐานข้อมูลก็จำเป็นต้องมีตารางเพิ่มเติมอีกตารางหนึ่ง
- การสร้างแบบจำลองเอนทิตีแทนการใช้แบบสอบถาม: การสร้างตารางข้อมูลนักเรียนและตารางข้อมูลหลักสูตร แล้วพยายามเชื่อมโยงทั้งสองตารางเข้าด้วยกันในแอปพลิเคชันนั้น ขัดกับวัตถุประสงค์ของการออกแบบ
- มีการลบและเขียนทับข้อมูลบ่อยครั้ง: การลบแต่ละครั้งจะสร้างบันทึกการลบที่ต้องอ่านและข้ามไปจนกว่าการบีบอัดจะลบออก ซึ่งจะทำให้การอ่านข้อมูลในพาร์ติชันที่มีการใช้งานบ่อยช้าลง
การหลีกเลี่ยงสิ่งเหล่านี้จะทำให้โครงสร้างข้อมูลสอดคล้องกับกฎที่ระบุไว้ด้านบนของหน้านี้ และสอดคล้องกับความแตกต่างเชิงสัมพันธ์ที่สรุปไว้ด้านล่าง
ความแตกต่างระหว่าง RDBMS และ Cassandra การสร้างแบบจำลองข้อมูล
| อาร์ดีบีเอ็มเอส | Cassandra |
|---|---|
| เก็บข้อมูลในรูปแบบมาตรฐาน | จัดเก็บข้อมูลในรูปแบบดีนอร์มอลไลซ์ |
| dbms ดั้งเดิม; ข้อมูลที่มีโครงสร้าง | จัดเก็บข้อมูลแบบแถวกว้าง แบบไดนามิก ทั้งข้อมูลที่มีโครงสร้างและไม่มีโครงสร้าง |
| โครงสร้างข้อมูล (Schema) ถูกออกแบบมาโดยคำนึงถึงเอนทิตี้และความสัมพันธ์ระหว่างเอนทิตี้เหล่านั้น | Schema ถูกออกแบบมาโดยคำนึงถึงคำสั่งค้นหาที่แอปพลิเคชันจะเรียกใช้ |
| รองรับการใช้คำสั่ง Join, GROUP BY และ WHERE clause ที่กำหนดเอง | ห้ามใช้การเชื่อมตารางหรือการกรองข้อมูลตามอำเภอใจ การค้นหาต้องตรงกับคีย์หลัก |
| โดยปกติแล้ว ตารางหนึ่งตารางจะรองรับการสอบถามข้อมูลที่หลากหลาย | โดยทั่วไปแล้ว ตารางหนึ่งตารางจะใช้สำหรับคำสั่งค้นหาข้อมูลเพียงคำสั่งเดียว ดังนั้นจึงมีการทำซ้ำข้อมูลในหลายตาราง |
| ความสมบูรณ์ของข้อมูลอ้างอิงที่บังคับใช้โดยคีย์ต่างประเทศ | ไม่มีคีย์ต่างประเทศ ความสอดคล้องกันระหว่างตารางที่ซ้ำกันเป็นความรับผิดชอบของแอปพลิเคชัน |
การตัดสินใจเกี่ยวกับรูปแบบเหล่านี้ถูกนำไปใช้ในทางปฏิบัติใน Cassandra ตาราง และ คีย์สเปซ บทเรียน
