Tôi mới đến Cassandra và đang tìm kiếm một thực hành tốt nhất về cách để mô hình hóa dữ liệu có chung này cấu như sau:nhất thực hành mô hình dữ liệu cho cơ sở dữ Cassandra
Dữ liệu được "sử dụng" dựa (mỗi khách hàng) , mỗi tệp cung cấp một tệp dữ liệu lớn có dung lượng khoảng 500K-2M (cập nhật định kỳ vài lần một ngày - đôi khi cập nhật đầy đủ và đôi khi chỉ có vùng đồng bằng)
Mỗi tệp dữ liệu có một số trường bắt buộc nhất định (~ 20 bắt buộc) nhưng có thể thêm các cột bổ sung theo quyết định của họ (tối đa ~ 100).
Các thêm trường dữ liệu là KHÔNG nhất thiết giống nhau cho những người sử dụng khác nhau (tên của các trường hoặc các loại của các lĩnh vực)
Ví dụ (định dạng csv :)
user_id_1.csv
| column1 (unique key per user_id) | column2 | column3 | ... | column10 | additionalColumn1 | ...additionalColumn_n |
|-----------------------------------|-----------|----------|---------|------------|---------------------|------------------------|
| user_id_1_key_1 | value | value | value | value | ... | value |
| user_id_1_key_2 | .... | .... | .... | .... | ... | ... |
| .... | ... | ... | ... | ... | ... | ... |
| user_id_1_key_2Million | .... | .... | .... | .... | ... | ... |
user_id_XXX.csv (notice that the first 10 columns are identical to the other users but the additional columns are different - both the names and their types)
| column1 (unique key per user_id) | column2 | column3 | ... | column10 | additionalColumn1 (different types than user_id_1 and others) | ...additional_column_x |
|-----------------------------------------------------------|-----------|----------|---------|------------|-----------------------------------------------------------------|-------------------------|
| user_id_XXX_key_1 | value | value | value | value | ... | value |
| user_id_XXX_key_2 | .... | .... | .... | .... | ... | ... |
| .... | ... | ... | ... | ... | ... | ... |
| user_id_XXX_key_500_thousand (less rows than other user) | .... | .... | .... | .... | ... | ... |
Một số tùy chọn tôi đã xem xét:
Tùy chọn 1:
- Tạo một "toàn cầu" keyspace
- Tạo một bảng lớn "dữ liệu" chứa tất cả mọi thứ
CONCATENATE một cột user_id cho tất cả các cột khác vào bảng lớn (bao gồm các cột không bắt buộc).Chìa khóa chính trở nên user_id + "column_1" (column_1 là duy nhất cho mỗi user_id)
Keyspace +--------------------------------------------------------------------------+ | | | | | Data_Table | | + +--------+-------+--------------------------+-----+ | | | | | | | | | | | +-------------------------------------------------+ | | | | | | | | | | many rows | +-------------------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Many columns | | | | | | | +------------------------> | | | | | | | | | | | | | +-------------------------------------------------+ | | v +-------------------------------------------------+ | | | +--------------------------------------------------------------------------+
Một vài điều mà tôi nhận thấy ngay lập tức:
- các user_id lặp lại nhiều lần như mục cho mỗi người dùng
- Các hàng rất thưa thớt cho các cột bổ sung (giá trị rỗng trống ) vì người dùng không nhất thiết phải chia sẻ chúng
- Số người dùng là rel atively nhỏ nên số thêm cột là không lớn (10K cột max)
- tôi có thể nhỏ gọn các cột dữ liệu bổ sung cho mỗi người dùng một cột gọi là "siêu dữ liệu" và chia sẻ nó mỗi tất cả người dùng
Phương án 2:
Tạo Keyspace mỗi user_id
Tạo bảng "dữ liệu" mỗi keyspace
+-----------------------------------------------------------------------------------+
| column_1 | column_2 | ... | column_n | additional_column_1 | additional_column_n |
+-----------------------------------------------------------------------------------+
keyspace_user1 keyspace_user2 keyspace_user_n
+----------------+ +---------------+ +---------------+
| | | | | |
| | | | | |
| +-+-+--+-+ | | +-+--+--+ | | +--+--+---+ |
| | | | | | | | | | | | | many keyspaces | | | | | |
| | | | | | | | | | | | | +-------------> | | | | | |
| | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | |
| +--------+ | | +-------+ | | +---------+ |
+----------------+ +---------------+ +---------------+
ghi chú:
- Nhiều keyspaces (keyspace cho mỗi người dùng)
- Tránh thêm "user_id" giá trị cho mỗi hàng (tôi có thể sử dụng tên không gian quan trọng như id người dùng)
- Rất vài bảng mỗi keyspace (trong ví dụ này chỉ có 1 bảng mỗi keyspace)
Lựa chọn 3:
1) Tạo một keyspace toàn cầu 2) Tạo một bảng mỗi user_id (các cột bắt buộc cũng như các cột bổ sung của họ cho mỗi bảng của họ)
+---------------------------------------------------------------+
| Keyspace |
| |
| user_1 user_2 user_n |
| +--+---+--+ +--+--+--+ +--+--+--+ |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| +--+---+--+ +--+--+--+ +--+--+--+ |
| |
| |
+---------------------------------------------------------------+
Ghi chú
- Phím xóa toàn cầu
- Bảng cho mỗi user_id (bảng "nhiều")
- Tránh trùng lặp id người dùng mỗi hàng
Tùy chọn 4: (Điều này có hợp lý không?)
Tạo nhiều keyspaces (ví dụ "x" số keyspaces) từng tổ chức một loạt các bảng (bảng cho mỗi người dùng)
keyspace_1 keyspace_x
+---------------------------------------------------------------+ +---------------------------------------------------------------+
| | | |
| | | |
| user_1 user_2 user_n/x | | user_n-x user_n-x+1 user_n |
| +--+---+--+ +--+--+--+ +--+--+--+ | | +--+------+ +--+--+--+ +--+--+--+ |
| | | | | | | | | | | | | | "X" keyspaces | | | | | | | | | | | | | |
| | | | | | | | | | | | | | +---------------------> | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| +--+---+--+ +--+--+--+ +--+--+--+ | | +--+---+--+ +--+--+--+ +--+--+--+ |
| | | |
| | | |
+---------------------------------------------------------------+ +---------------------------------------------------------------+
Ghi chú:
- Nhiều keyspaces
- Nhiều bảng cho mỗi người dùng
- Yêu cầu "tra cứu" để tìm ra không gian phím nào chứa bảng được yêu cầu
Lựa chọn 5:
Chia dữ liệu vào nhiều bảng và nhiều keyspaces
Ghi chú: 1. Yêu cầu "gia nhập" thông tin từ nhiều bảng trong một số trường hợp 2. Có vẻ là phức tạp hơn
Chung n OTES cho tất cả các kịch bản:
- Có một mức độ ít viết hơn đọc
- Nhiều triệu lượt đọc mỗi ngày
- giao thông dao động mỗi user_id - một số user_ids có rất nhiều giao thông và một số user_ids chỉ còn lại ít nhiều giao thông . Sẽ cần phải điều chỉnh mỗi số liệu này
- Một số user_ids được cập nhật (viết) thường xuyên hơn những người khác
- Chúng tôi có nhiều trung tâm dữ liệu trên toàn khu vực địa lý và cần đồng bộ hóa
- Có một cái đuôi dài mỗi khóa chính (một số phím được truy cập nhiều lần trong khi các phím khác hiếm khi truy cập)
Tôi mới làm quen với cassandra, nhưng tùy chọn 1 có ý nghĩa nhất đối với tôi. Cassandra được xây dựng cho các cột thưa thớt. Ngoài ra, có một cái nhìn tại các khóa chính composite - PRIMARY KEY (key_part_one, key_part_two). có một cái nhìn ở đây: https://stackoverflow.com/a/24953331/1277048. điều này cung cấp một số tính linh hoạt trong việc truy xuất phương pháp nối: bạn có thể đọc TẤT CẢ các dòng với key_part_one trong một yêu cầu HOẶC chỉ dòng phù hợp (key_part_one, key_part_two). – FuzzyAmi
Liệt kê tất cả truy vấn chọn của bạn, sau đó thiết kế mô hình dữ liệu của bạn theo truy vấn của bạn. –