SingleStore là hệ quản trị cơ sở dữ liệu hiện đại hỗ trợ nhiều mô hình dữ liệu khác nhau bao gồm dữ liệu chuỗi thời gian, dữ liệu không gian địa lý, dữ liệu JSON, v.v. Khả năng này mang lại nhiều lợi ích cho doanh nghiệp, các nhà phát triển và giúp giảm TCO và cải thiện ROI. Hình vẽ mô tả kiến trúc cơ bản của SingleStore.
SingleStore hỗ trợ các function với dữ liệu chuỗi thời gian. SQL chuẩn đã cung cấp một loạt các chức năng hữu ích để làm việc với dữ liệu chuỗi thời gian, nhưng SingleStore có thêm FIRST, LAST và TIME_BUCKET. Hãy cùng phân tích một ví dụ sử dụng dữ liệu tick. Ta có thể tạo một bảng để lưu dữ liệu tick như sau:
CREATE DATABASE IF NOT EXISTS timeseries_db;
USE timeseries_db;
CREATE ROWSTORE TABLE IF NOT EXISTS tick (
ts DATETIME SERIES TIMESTAMP,
symbol VARCHAR(5),
price NUMERIC(18, 4),
KEY(ts)
);
Ở đây, chúng ta có thuộc tính ts có giá trị thời gian sử dụng DATETIME. SERIES TIMESTAMP chỉ định một cột trong bảng làm dấu thời gian mặc định. Khóa trên trường ts cho phép lọc các giá trị phạm vi một cách hiệu quả.
Chúng ta có thể sử dụng phân bổ thời gian để tổng hợp và nhóm dữ liệu cho các chuỗi thời gian khác nhau theo một khoảng thời gian cố định. Ví dụ: TIME_BUCKET có thể được sử dụng để tìm giá trị chuỗi thời gian trung bình được nhóm theo khoảng thời gian ba ngày, như sau:
CREATE DATABASE IF NOT EXISTS timeseries_db;
SELECT symbol, TIME_BUCKET(“3d”, ts), AVG(price)
FROM tick
WHERE symbol = “AAPL”
GROUP BY 1, 2
ORDER BY 1, 2;
Chúng ta cũng có thể kết hợp FIRST, LAST và TIME_BUCKET để tạo biểu đồ hình nến hiển thị mức cao, thấp, mở và đóng của một cổ phiếu theo thời gian, được giới hạn bởi cửa sổ ba ngày, như dưới đây:
SELECT TIME_BUCKET(“3d”) AS ts,
symbol,
MIN(price) AS low,
MAX(price) AS high,
FIRST(price) AS open,
LAST(price) AS close
FROM tick
WHERE symbol = “AAPL”
GROUP BY 2, 1
ORDER BY 2, 1;
2. JSON
JSON là định dạng dữ liệu phổ biến hiện nay và được sử dụng trong nhiều loại ứng dụng. Ví dụ: JSON được dùng cho các ứng dụng thương mại điện tử, nơi chúng ta có thể lưu trữ nhiều sản phẩm mà mỗi sản phẩm có các đặc điểm khác nhau. SingleStore hỗ trợ kiểu dữ liệu JSON và nhiều hàm JSON có thể giúp quản lý dữ liệu JSON một cách hiệu quả.
Chúng ta có thể tạo bảng để lưu trữ dữ liệu sản phẩm thương mại điện tử như sau:
CREATE DATABASE IF NOT EXISTS e_store;
USE e_store;
CREATE TABLE products (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(250) NOT NULL,
brand_id INT UNSIGNED NOT NULL,
category_id INT UNSIGNED NOT NULL,
attributes JSON NOT NULL,
PRIMARY KEY(id),
INDEX CATEGORY_ID(category_id ASC),
INDEX BRAND_ID(brand_id ASC)
);
Bảng products có cột attributes có kiểu JSON. Cột này sử dụng NOT NULL, cho phép SingleStore báo lỗi nếu có giao dịch lưu trữ dữ liệu JSON không hợp lệ.
SingleStore cũng có thể xử lý các cấu trúc JSON phẳng:
{
“sensor_type” : “CMOS”,
“processor” : “Digic DV III”,
“scanning_system” : “progressive”,
“mount_type” : “PL”,
“monitor_type” : “LCD”
}
Dạng array:
{
“body” : “5.11 x 2.59 x 0.46 inches”,
“display” : “4.5 inches”,
“network” : [
“GSM”,
“CDMA”,
“HSPA”,
“EVDO”
],
“os” : “Android Jellybean v4.3”,
“resolution” : “720 x 1280 pixels”,
“sim” : “Micro-SIM”,
“weight” : “143 grams”
}
Và dạng lồng ghép:
{
“screen” : “50 inch”,
“resolution” : “2048 x 1152 pixels”,
“ports” : {
“hdmi” : 1,
“usb” : 3
},
“speakers” : {
“left” : “10 watt”,
“right” : “10 watt”
}
}
Chúng ta có thể sử dụng sức mạnh của SQL kết hợp với dữ liệu JSON. Ví dụ:
SELECT * FROM products
WHERE category_id = 1
AND attributes::ports::usb > 0
AND attributes::ports::hdmi > 0;
Trong ví dụ trên, hai dấu hai chấm (::) cung cấp đường dẫn đến thuộc tính cụ thể mà chúng ta quan tâm. Trong trường hợp này, chúng ta đang tìm TV (category_id 1) có một hoặc nhiều cổng USB và HDMI. Trong ví dụ sau, chúng ta đang kiểm tra thuộc tính os bằng cách sử dụng toán tử LIKE của SQL:
DELETE FROM products
WHERE category_id = 2
AND attributes::$os LIKE ‘%Jellybean%’;
Các trường hợp sử dụng tài liệu là trường hợp đặc biệt của các trường hợp sử dụng key-value trong đó mục tiêu là mở rộng quy mô đồng thời ghi nhanh và đọc nhanh đối với lượng dữ liệu tương đối nhỏ.
3. Full-Text Search
Có nhiều trường hợp chúng ta cần tìm kiếm từ khóa trên văn bản, bao gồm các bài báo, tạp chí, bài đánh giá nhà hàng, khách sạn, v.v. Chúng ta sẽ cần lưu trữ và tìm kiếm trong văn bản có khối lượng lớn và trả về kết quả dựa trên mức độ liên quan. Hãy xem một ví dụ lưu trữ các bài báo từ tạp chí y khoa:
CREATE DATABASE IF NOT EXISTS fulltext_db;
USE fulltext_db;
CREATE TABLE journals(
volume VARCHAR(1000),
name VARCHAR(1000),
journal VARCHAR(1000),
body LONGTEXT,
KEY(volume),
FULLTEXT(body)
);
Cột body sử dụng LONGTEXT để lưu trữ nội dung bài báo. Chúng ta cũng tạo inverted index trên cột body bằng FULLTEXT.
SingleStore hỗ trợ các chức năng MATCH và HIGHLIGHT để sử dụng với tìm kiếm toàn văn. Trong ví dụ sau, chúng ta đang tìm kiếm các bài báo có chứa từ optometry sử dụng MATCH:
SELECT *
FROM journals
WHERE MATCH(body) AGAINST (‘optometry’);
HIGHLIGHT sẽ trả về offset, số lượng thuật ngữ duy nhất và một lượng nhỏ văn bản. Đây là một truy vấn ví dụ cho từ pediatrician:
SELECT HIGHLIGHT(body) AGAINST (‘pediatrician’)
FROM journals
WHERE MATCH(body) AGAINST (‘pediatrician’);
SingleStore cũng hỗ trợ nhiều toán tử (ví dụ: +, -), cũng như hỗ trợ tìm kiếm mờ (~) cùng với một (?) và nhiều ký tự đại diện (*).
Tổng kết
Trên đây là giới thiệu ngắn gọn về khả năng hỗ trợ linh hoạt nhiều mô hình dữ liệu của SingleStore. Sử dụng SingleStore giúp đơn giản hóa việc quản trị, tiết kiệm đáng kể thời gian và chi phí cho doanh nghiệp.
Tham khảo: https://db-engines.com/en/blog_post/95