Cassandra โมเดลข้อมูลพร้อมตัวอย่างฐานข้อมูลอย่างง่าย

⚡ สรุปอย่างชาญฉลาด

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

  • 🇧🇷 การเขียนนั้นราคาถูก: Cassandra ได้รับการปรับให้เหมาะสมสำหรับปริมาณการเขียนข้อมูล ดังนั้นการทำสำเนาข้อมูลข้ามตารางจึงเป็นวิธีที่ยอมรับกันโดยทั่วไปเพื่อให้การอ่านข้อมูลรวดเร็ว
  • 📋 สอบถามก่อน: ระบุคำถามที่แอปพลิเคชันต้องตอบ จากนั้นสร้างตารางหนึ่งตารางต่อคำถามหนึ่งข้อ แทนที่จะสร้างตารางหนึ่งตารางต่อเอนทิตีหนึ่งรายการ
  • 🔑 รหัสพาร์ติชั่น: องค์ประกอบแรกของคีย์หลักจะเป็นตัวกำหนดว่าโหนดใดจะจัดเก็บแถวนั้น และด้วยเหตุนี้จึงกำหนดว่าข้อมูลจะกระจายอย่างสม่ำเสมอเพียงใด
  • 🧩 Clusterคอลัมน์ ing: องค์ประกอบคีย์หลักที่เหลือจะเรียงลำดับแถวภายในพาร์ติชันและช่วยให้สามารถค้นหาตามช่วงได้
  • 📏 ขนาดพาร์ติชั่น: การแบ่งพาร์ติชันน้อยเกินไปจะทำให้เกิดจุดที่มีการใช้งานมากเกินไปและแถวที่มีขนาดใหญ่เกินไป การแบ่งพาร์ติชันมากเกินไปจะทำให้การอ่านต้องไปตรวจสอบหลายโหนด
  • 🔗 ความสัมพันธ์: การค้นหาแบบหนึ่งต่อหนึ่งต้องการตารางเดียว การค้นหาแบบหนึ่งต่อหลายต้องการคีย์ผสม และการค้นหาแบบหลายต่อหลายต้องการตารางหนึ่งตารางต่อทิศทางการค้นหาแต่ละทิศทาง

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

ความสัมพันธ์แบบหนึ่งต่อหนึ่งหมายถึงสองตารางมีการติดต่อกันแบบหนึ่งต่อหนึ่ง ตัวอย่างเช่น นักเรียนสามารถลงทะเบียนได้เพียงหลักสูตรเดียว และฉันต้องการค้นหานักเรียนว่ามีนักเรียนคนใดลงทะเบียนในหลักสูตรใด

ดังนั้นในกรณีนี้ โครงร่างตารางของคุณควรครอบคลุมรายละเอียดทั้งหมดของนักเรียนที่สอดคล้องกับหลักสูตรนั้นๆ เช่น ชื่อหลักสูตร หมายเลขประจำตัวนักเรียน ชื่อนักเรียน เป็นต้น

ความสัมพันธ์แบบหนึ่งต่อหนึ่งใน Cassandra
ความสัมพันธ์แบบหนึ่งต่อหนึ่งใน Cassandra

แผนภาพด้านบนแสดงให้เห็นว่าตารางเดียวใช้สำหรับการสืบค้นข้อมูล เนื่องจากนักเรียนหนึ่งคนจะเรียนในหลักสูตรเดียวเท่านั้น

CREATE TABLE Student_Course (
    Student_rollno int PRIMARY KEY,
    Student_name text,
    Course_name text
);

เนื่องจาก Student_rollno เป็นคีย์พาร์ติชัน การค้นหาด้วยหมายเลขประจำตัวนักเรียนจึงอ่านได้เพียงหนึ่งพาร์ติชันเท่านั้น

การจัดการความสัมพันธ์แบบหนึ่งต่อหลายความสัมพันธ์ใน Cassandra

ความสัมพันธ์แบบหนึ่งต่อหลายความสัมพันธ์หมายถึงการมีความสอดคล้องกันแบบหนึ่งต่อหลายรายการระหว่างสองตาราง

ตัวอย่างเช่น นักเรียนจำนวนมากสามารถเรียนหลักสูตรหนึ่งได้ ฉันต้องการค้นหานักเรียนทุกคนที่กำลังเรียนหลักสูตรใดหลักสูตรหนึ่ง

ดังนั้นการสอบถามชื่อรายวิชาจะทำให้มีชื่อนักศึกษาที่จะเรียนรายวิชาใดวิชาหนึ่งเป็นจำนวนมาก

ความสัมพันธ์แบบหนึ่งต่อหลายความสัมพันธ์ใน Cassandra
ความสัมพันธ์แบบหนึ่งต่อหลายความสัมพันธ์ใน 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

ความสัมพันธ์แบบหลายต่อมากหมายถึงการมีความสัมพันธ์กันหลายต่อมากระหว่างสองตาราง

ตัวอย่างเช่น นักเรียนหลายคนสามารถเรียนหลักสูตรหนึ่งได้ และนักเรียนหนึ่งคนก็สามารถเรียนหลายหลักสูตรได้เช่นกัน

หลายต่อหลายความสัมพันธ์ใน Cassandra
หลายต่อหลายความสัมพันธ์ใน 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 ตาราง และ คีย์สเปซ บทเรียน

คำถามที่พบบ่อย

ควรตั้งเป้าหมายให้แต่ละพาร์ติชันมีขนาดไม่เกิน 100 MB และมีจำนวนแถวประมาณ 100,000 แถว พาร์ติชันขนาดใหญ่เกินไปจะทำให้การอ่านข้อมูลช้าลง เพิ่มเวลาในการซ่อมแซม และเพิ่มภาระให้กับหน่วยความจำระหว่างการบีบอัดข้อมูล

คีย์พาร์ติชันจะเป็นตัวกำหนดว่าโหนดใดจะจัดเก็บข้อมูลแถวนั้น Clusterคอลัมน์กำหนดลำดับการเรียงของแถวภายในพาร์ติชันนั้น และอนุญาตให้ทำการค้นหาตามช่วง เช่น ช่วงวันที่

Materialized views ช่วยสร้างสำเนาข้อมูลโดยอัตโนมัติ แต่ยังคงเป็นฟีเจอร์ทดลองที่มีข้อจำกัดด้านความสอดคล้องอยู่ โดยส่วนใหญ่แล้วสคีมาในระบบการผลิตยังคงเก็บตารางที่สองจากแอปพลิเคชันไว้

AI สามารถแปลงเอนทิตีเป็นตารางผู้สมัครได้ แต่... Cassandra โครงสร้างตารางจะยึดตามคำสั่งค้นหามากกว่าเอนทิตี้ โปรดระบุรายการคำสั่งค้นหาก่อน จากนั้นให้ถือว่าตารางที่สร้างขึ้นเป็นแบบร่างเพื่อตรวจสอบความถูกต้องตามขนาดของพาร์ติชัน

เมื่อทราบจำนวนคอลัมน์และจำนวนแถวที่คาดการณ์ไว้ AI สามารถระบุคีย์ที่อาจก่อให้เกิดฮอตสปอตหรือพาร์ติชันที่ไม่จำกัดได้ ตรวจสอบความถูกต้องของคำเตือนด้วยคำสั่ง nodetool tablehistograms เมื่อโหลดข้อมูลจริงแล้ว

สรุปโพสต์นี้ด้วย: