Cassandra Mô hình dữ liệu với ví dụ cơ sở dữ liệu đơn giản

⚡ Tóm tắt thông minh

Cassandra Các quy tắc mô hình dữ liệu đảo ngược thói quen thiết kế quan hệ: các bảng được xây dựng cho các truy vấn chứ không phải cho các thực thể. Trang này bao gồm các quy tắc cốt lõi, lựa chọn khóa phân vùng và các lược đồ được xây dựng cho các mối quan hệ một-một, một-nhiều và nhiều-nhiều.

  • 🇧🇷 Viết lách thì rẻ: Cassandra Hệ thống được tối ưu hóa cho thông lượng ghi, vì vậy việc sao chép dữ liệu giữa các bảng là cách được chấp nhận để tăng tốc độ đọc.
  • 📋 Truy vấn đầu tiên: Liệt kê các truy vấn mà ứng dụng phải trả lời, sau đó tạo một bảng cho mỗi truy vấn thay vì một bảng cho mỗi thực thể.
  • 🔑 Khóa phân vùng: Thành phần đầu tiên của khóa chính quyết định nút nào lưu trữ hàng dữ liệu và do đó quyết định mức độ phân bổ dữ liệu đồng đều như thế nào.
  • 🧩 ClusterCột ing: Các phần tử khóa chính còn lại sắp xếp các hàng bên trong một phân vùng và cho phép truy vấn theo phạm vi.
  • 📏 Kích thước phân vùng: Quá ít phân vùng tạo ra các điểm nóng và các hàng có kích thước quá lớn; quá nhiều phân vùng buộc thao tác đọc phải truy cập nhiều nút.
  • 🔗 Các mối quan hệ: Quan hệ một-một cần một bảng duy nhất, quan hệ một-nhiều cần khóa phức hợp, và quan hệ nhiều-nhiều cần một bảng cho mỗi hướng truy vấn.

Cassandra Ví dụ về mô hình dữ liệu

Mặc dù Cassandra Ngôn ngữ truy vấn tương tự như SQL ngôn ngữ, phương pháp mô hình hóa dữ liệu của họ hoàn toàn khác nhau.

In Cassandra, một mô hình dữ liệu kém có thể làm giảm hiệu suất, đặc biệt khi người dùng cố gắng triển khai các khái niệm RDBMS trên Cassandra. Tốt nhất bạn nên ghi nhớ một số quy tắc chi tiết dưới đây.

Cassandra Quy tắc mô hình dữ liệu

In Cassandra, viết không đắt tiền. Cassandra không hỗ trợ các phép nối, nhóm theo, mệnh đề OR, tập hợp, v.v. Vì vậy, bạn phải lưu trữ dữ liệu của mình theo cách có thể truy xuất được hoàn toàn. Vì vậy, những quy tắc này phải được ghi nhớ trong khi lập mô hình dữ liệu trong Cassandra.

Tối đa hóa số lượng ghi

In Cassandra, viết rất rẻ. Cassandra Hệ thống được tối ưu hóa cho hiệu suất ghi cao. Vì vậy, hãy cố gắng tối đa hóa số lần ghi để có hiệu suất đọc tốt hơn và khả năng truy cập dữ liệu cao hơn. Có sự đánh đổi giữa việc ghi dữ liệu và đọc dữ liệu. Do đó, hãy tối ưu hóa hiệu suất đọc dữ liệu bằng cách tối đa hóa số lần ghi dữ liệu.

Tối đa hóa việc sao chép dữ liệu

Việc không chuẩn hóa dữ liệu và sao chép dữ liệu là sự thật của Cassandra. Dung lượng ổ đĩa không đắt hơn bộ nhớ, xử lý CPU và hoạt động IO. BẰNG Cassandra là một cơ sở dữ liệu phân tán, do đó việc sao chép dữ liệu cung cấp dữ liệu sẵn có ngay lập tức và không có điểm lỗi nào.

Cassandra Mục tiêu lập mô hình dữ liệu

Bạn nên có các mục tiêu sau khi mô hình hóa dữ liệu trong Cassandra:

Trải đều dữ liệu xung quanh Cluster

Bạn muốn có lượng dữ liệu bằng nhau trên mỗi nút của Cassandra ClusterDữ liệu được phân bổ đến các nút khác nhau dựa trên khóa phân vùng, là phần đầu tiên của khóa chính. Vì vậy, hãy cố gắng chọn một cột có số lượng giá trị lớn làm khóa phân vùng để phân bổ dữ liệu đồng đều khắp cụm.

Giảm thiểu số lượng phân vùng được đọc trong khi truy vấn dữ liệu

Phân vùng là một nhóm các bản ghi có cùng khóa phân vùng. Khi truy vấn đọc được đưa ra, nó sẽ thu thập dữ liệu từ các nút khác nhau từ các phân vùng khác nhau.

Nếu có nhiều phân vùng thì cần phải truy cập tất cả các phân vùng này để thu thập dữ liệu truy vấn.

Điều đó không có nghĩa là không nên tạo phân vùng. Nếu dữ liệu của bạn rất lớn, bạn không thể lưu trữ lượng dữ liệu khổng lồ đó trên một phân vùng duy nhất. Phân vùng đơn lẻ sẽ làm chậm tốc độ hoạt động.

Vì vậy, hãy cố gắng chọn số lượng phân vùng cân bằng.

Khóa chính tốt trong Cassandra

Cả hai mục tiêu trên đều quy về một quyết định duy nhất, vì vậy hai sơ đồ bên dưới thể hiện cùng một bảng với khóa không tốt và sau đó là khóa tốt.

Chúng ta hãy lấy một ví dụ và tìm xem khóa chính nào là tốt.

Đây là bảng MusicPlaylist.

CREATE TABLE MusicPlaylist (
    SongId int,
    SongName text,
    Year int,
    Singer text,
    PRIMARY KEY (SongId, SongName)
);

Trong ví dụ trên, bảng MusicPlaylist,

  • SongId là khóa phân vùng, và
  • SongName là cột phân cụm
  • Dữ liệu sẽ được phân cụm dựa trên Tên bài hát (SongName). Chỉ một phân vùng sẽ được tạo cho mỗi ID bài hát (SongId), và vì mỗi bài hát có một mã định danh riêng biệt, nên mỗi phân vùng chỉ chứa một hàng dữ liệu.

Việc truy xuất dữ liệu sẽ bị chậm bởi mô hình dữ liệu này do khóa chính không hợp lệ.

Đây là một bảng khác MusicPlaylist.

CREATE TABLE MusicPlaylist (
    SongId int,
    SongName text,
    Year int,
    Singer text,
    PRIMARY KEY ((SongId, Year), SongName)
);

Trong ví dụ trên, bảng MusicPlaylist,

  • SongId và Year là khóa phân vùng, và
  • SongName là cột phân cụm.
  • Dữ liệu sẽ được phân cụm trên cơ sở SongName. Trong bảng này, mỗi năm sẽ có một phân vùng mới được tạo. Tất cả các bài hát của năm sẽ nằm trên cùng một nút. Khóa chính này sẽ rất hữu ích cho dữ liệu.

Việc truy xuất dữ liệu của chúng ta sẽ nhanh chóng nhờ mô hình dữ liệu này.

Lập mô hình dữ liệu của bạn trong Cassandra

Bạn cần lưu ý những điều sau khi lập mô hình truy vấn:

Xác định những truy vấn bạn muốn hỗ trợ

Trước hết, hãy xác định những truy vấn bạn muốn.

Ví dụ, bạn có cần không?

  • Tham gia
  • Nhóm theo
  • Lọc trên cột nào, v.v.

Tạo bảng theo truy vấn của bạn

Tạo bảng theo truy vấn của bạn. Tạo một bảng sẽ đáp ứng các truy vấn của bạn. Cố gắng tạo một bảng sao cho số lượng phân vùng tối thiểu cần được đọc.

Ba phần tiếp theo sẽ áp dụng nguyên tắc đó cho ba loại mối quan hệ thường thấy trong hầu hết mọi sơ đồ.

Xử lý mối quan hệ một đối một trong Cassandra

Mối quan hệ 1-1 có nghĩa là hai bảng có sự tương ứng 1-1. Ví dụ: sinh viên chỉ có thể đăng ký một khóa học và tôi muốn tìm kiếm một sinh viên mà khóa học mà một sinh viên cụ thể đã đăng ký.

Vì vậy, trong trường hợp này, lược đồ bảng của bạn phải bao gồm tất cả các chi tiết của sinh viên tương ứng với khóa học cụ thể đó như tên khóa học, số hiệu danh sách của sinh viên, tên sinh viên, v.v.

Mối quan hệ một đối một trong Cassandra
Mối quan hệ một đối một trong Cassandra

Sơ đồ trên cho thấy một bảng duy nhất phục vụ cho truy vấn, bởi vì mỗi sinh viên tương ứng chính xác với một khóa học.

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

Vì Student_rollno là khóa phân vùng, nên việc tra cứu theo số hiệu sinh viên chỉ đọc chính xác một phân vùng.

Xử lý mối quan hệ một-nhiều trong Cassandra

Mối quan hệ một đến nhiều có nghĩa là có một đến nhiều sự tương ứng giữa hai bảng.

Ví dụ, một khóa học có thể được nhiều sinh viên theo học. Tôi muốn tìm kiếm tất cả các sinh viên đang theo học một khóa học cụ thể.

Vì vậy, bằng cách truy vấn tên khóa học, tôi sẽ có nhiều tên sinh viên sẽ theo học một khóa học cụ thể.

Mối quan hệ một-nhiều trong Cassandra
Mối quan hệ một-nhiều trong Cassandra

Ở đây, tên khóa học trở thành khóa phân vùng để đảm bảo mọi sinh viên trong cùng một khóa học đều thuộc cùng một phân vùng, và số thứ tự sinh viên trở thành cột nhóm để mỗi sinh viên vẫn là một hàng riêng biệt.

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

Tôi có thể lấy thông tin về tất cả học sinh của một khóa học cụ thể bằng truy vấn sau.

SELECT * FROM Student_Course WHERE Course_name = 'Course Name';

Xử lý mối quan hệ nhiều-nhiều trong Cassandra

Mối quan hệ nhiều-nhiều có nghĩa là có nhiều-nhiều sự tương ứng giữa hai bảng.

Ví dụ, một khóa học có thể được nhiều sinh viên học và một sinh viên cũng có thể học nhiều khóa học.

Mối quan hệ nhiều với nhiều trong Cassandra
Mối quan hệ nhiều với nhiều trong Cassandra

Tôi muốn tìm kiếm tất cả các sinh viên đang theo học một khóa học cụ thể. Ngoài ra, tôi muốn tìm kiếm tất cả khóa học mà một sinh viên cụ thể đang theo học.

Trong trường hợp này, tôi sẽ có hai bảng, tức là chia bài toán thành hai trường hợp. Đây là minh họa rõ ràng nhất cho quy tắc trùng lặp: cùng một dữ liệu được ghi lại hai lần để mỗi truy vấn chỉ đọc một phân vùng.

Đầu tiên, tôi sẽ tạo một bảng để bạn có thể tìm các khóa học của một sinh viên cụ thể.

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

Tôi có thể tìm thấy tất cả các khóa học của một học viên cụ thể bằng truy vấn sau.

SELECT * FROM Student_Course WHERE Student_rollno = 101;

Thứ hai, tôi sẽ tạo một bảng để bạn có thể biết có bao nhiêu sinh viên đang theo học một khóa học cụ thể.

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

Tôi có thể tìm kiếm một sinh viên trong một khóa học cụ thể bằng truy vấn sau.

SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';

Cả hai bảng phải được ghi dữ liệu mỗi khi sinh viên tham gia một khóa học, thông thường trong cùng một lô ghi dữ liệu để hai bản sao luôn được đồng bộ.

Chung Cassandra Những sai lầm trong mô hình hóa dữ liệu

Hầu hết các lược đồ kém chất lượng đều lặp lại một số ít lỗi giống nhau, và mỗi lược đồ đều như vậy. tracĐiều này quay trở lại thói quen được kế thừa từ thiết kế quan hệ.

  • Phân vùng không giới hạn: Việc chọn khóa phân vùng như tên quốc gia sẽ gom hàng triệu hàng vào một phân vùng. Thêm nhóm thời gian, ví dụ (quốc gia, tháng), để giữ cho các phân vùng có kích thước hợp lý.
  • Các khóa có số lượng phần tử rất thấp: Khóa phân vùng chỉ có một vài giá trị khả dụng, chẳng hạn như cờ trạng thái, sẽ tập trung toàn bộ lưu lượng truy cập vào một vài nút và để phần còn lại ở trạng thái nh闲 rỗi.
  • Sử dụng ALLOW FILTERING để truy vấn hoạt động: Nó quét mọi phân vùng và che giấu một vấn đề về mô hình hóa. Nếu một truy vấn cần đến nó, lược đồ cần thêm một bảng khác.
  • Mô hình hóa các thực thể thay vì các truy vấn: Việc tạo ra một bảng sinh viên và một bảng khóa học, rồi cố gắng kết hợp chúng trong ứng dụng, sẽ làm mất đi mục đích của thiết kế.
  • Thường xuyên xóa và ghi đè: Mỗi thao tác xóa đều tạo ra một bản ghi đánh dấu (tombstone) mà hệ thống phải đọc và bỏ qua cho đến khi quá trình nén dữ liệu loại bỏ nó, điều này làm chậm quá trình đọc trên các phân vùng thường xuyên được sử dụng.

Việc tránh những điều này giúp lược đồ phù hợp với các quy tắc đã nêu ở đầu trang này và với các mối quan hệ được tóm tắt bên dưới.

Sự khác biệt giữa RDBMS và Cassandra Mô hình hóa dữ liệu

RDBMS Cassandra
Lưu trữ dữ liệu ở dạng chuẩn hóa Lưu trữ dữ liệu ở dạng không chuẩn hóa
dbms kế thừa; Dữ liệu có cấu trúc Kho lưu trữ hàng loạt, động; dữ liệu có cấu trúc và không có cấu trúc
Schema được thiết kế dựa trên các thực thể và mối quan hệ giữa chúng. Schema được thiết kế dựa trên các truy vấn mà ứng dụng sẽ chạy.
Các phép nối, nhóm theo và mệnh đề WHERE tùy ý đều được hỗ trợ. Không được phép kết hợp các phép toán hoặc lọc tùy ý; các truy vấn phải khớp với khóa chính.
Một bảng thường phục vụ nhiều truy vấn khác nhau. Thông thường, mỗi bảng chỉ phục vụ một truy vấn, do đó dữ liệu bị trùng lặp giữa các bảng.
Tính toàn vẹn tham chiếu được đảm bảo bằng khóa ngoại. Không có khóa ngoại; tính nhất quán giữa các bảng trùng lặp là trách nhiệm của ứng dụng.

Các quyết định về lược đồ này được áp dụng trong thực tế tại Cassandra bànkhông gian phím hướng dẫn.

Câu Hỏi Thường Gặp

Nên đặt mục tiêu dung lượng dưới 100 MB và khoảng 100,000 hàng trên mỗi phân vùng. Các phân vùng lớn hơn sẽ làm chậm quá trình đọc, tăng thời gian sửa chữa và gây áp lực lên bộ nhớ trong quá trình nén dữ liệu.

Khóa phân vùng quyết định nút nào lưu trữ hàng dữ liệu. ClusterCác cột này quyết định thứ tự sắp xếp các hàng bên trong phân vùng đó và cho phép các truy vấn phạm vi, chẳng hạn như khoảng thời gian.

Các materialized view tự động hóa việc sao chép dữ liệu, nhưng chúng vẫn là một tính năng thử nghiệm với các trường hợp ngoại lệ về tính nhất quán đã biết. Hầu hết các schema sản xuất vẫn duy trì bảng thứ hai từ ứng dụng.

Trí tuệ nhân tạo có thể chuyển đổi các thực thể thành các bảng ứng viên, nhưng... Cassandra Lược đồ tuân theo các truy vấn chứ không phải các thực thể. Hãy cung cấp danh sách truy vấn trước, sau đó coi các bảng được tạo ra như bản nháp để kiểm tra xem có phù hợp với kích thước phân vùng hay không.

Dựa trên số lượng cột và số lượng hàng dự kiến, AI có thể gắn cờ các khóa có khả năng tạo ra các điểm nóng hoặc phân vùng không giới hạn. Xác nhận cảnh báo bằng lệnh nodetool tablehistograms sau khi dữ liệu thực được tải.

Tóm tắt bài viết này với: