Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1 Những thanh kiếm cơ sở dữ liệu thực sự - toàn cầu - đã được biết đến từ lâu nhưng vẫn ít người biết cách sử dụng chúng một cách hiệu quả hoặc thậm chí không sở hữu siêu vũ khí này.

Nếu bạn sử dụng toàn cầu để giải quyết những vấn đề mà họ thực sự giỏi, bạn có thể đạt được kết quả vượt trội. Hoặc về năng suất hoặc đơn giản hóa giải pháp của vấn đề (1, 2).

Globals là một cách lưu trữ và xử lý dữ liệu đặc biệt, hoàn toàn khác với các bảng trong SQL. Chúng xuất hiện vào năm 1966 bằng ngôn ngữ M(UMPS) (phát triển tiến hóa - Tập lệnh đối tượng bộ đệm, sau đây gọi là COS) trong cơ sở dữ liệu y tế và vẫn còn ở đó tích cực sử dụng, đồng thời thâm nhập vào một số lĩnh vực khác đòi hỏi độ tin cậy và hiệu suất cao: tài chính, giao dịch, v.v.

Globals trong DBMS hiện đại hỗ trợ các giao dịch, ghi nhật ký, sao chép và phân vùng. Những thứ kia. chúng có thể được sử dụng để xây dựng các hệ thống hiện đại, đáng tin cậy, phân tán và nhanh chóng.

Globals không giới hạn bạn trong mô hình quan hệ. Chúng cho phép bạn tự do phát triển cấu trúc dữ liệu được tối ưu hóa cho các tác vụ cụ thể. Đối với nhiều ứng dụng, việc sử dụng thông minh toàn cầu có thể thực sự là một vũ khí bí mật, mang lại hiệu suất mà các nhà phát triển ứng dụng quan hệ chỉ có thể mơ ước.

Globals như một cách để lưu trữ dữ liệu có thể được sử dụng trong nhiều ngôn ngữ lập trình hiện đại, cả cấp cao và cấp thấp. Vì vậy, trong bài viết này, tôi sẽ tập trung cụ thể vào các ngôn ngữ toàn cầu chứ không phải ngôn ngữ mà chúng từng xuất hiện.

2. Toàn cầu hoạt động như thế nào

Trước tiên chúng ta hãy hiểu cách thức hoạt động của toàn cầu và điểm mạnh của chúng là gì. Globals có thể được xem xét từ các quan điểm khác nhau. Trong phần này của bài viết chúng ta sẽ xem chúng như những cái cây. Hoặc giống như kho dữ liệu phân cấp.

Nói một cách đơn giản, toàn cục là một mảng liên tục. Một mảng được tự động lưu vào đĩa.
Thật khó để tưởng tượng một cái gì đó đơn giản hơn để lưu trữ dữ liệu. Trong mã (trong ngôn ngữ COS/M), nó chỉ khác với mảng kết hợp thông thường ở ký hiệu ^ trước tên.

Để lưu dữ liệu trên toàn cầu, bạn không cần phải học ngôn ngữ truy vấn SQL, các lệnh để làm việc với chúng rất đơn giản. Họ có thể được học trong một giờ.

Hãy bắt đầu với ví dụ đơn giản nhất. Cây đơn cấp có 2 nhánh. Các ví dụ được viết bằng COS.

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"



Khi chèn thông tin vào toàn cục (Lệnh Set), 3 điều sẽ tự động xảy ra:

  1. Lưu dữ liệu vào đĩa.
  2. Lập chỉ mục. Những gì trong ngoặc đơn là khóa (trong văn học Anh - “chỉ số dưới”) và bên phải dấu bằng là giá trị (“giá trị nút”).
  3. Sắp xếp. Dữ liệu được sắp xếp theo khóa. Trong tương lai, khi duyệt mảng, phần tử đầu tiên sẽ là “Sergey Smith” và phần tử thứ hai là “John Sidorov”. Khi nhận được danh sách người dùng từ toàn cầu, cơ sở dữ liệu không mất thời gian sắp xếp. Hơn nữa, bạn có thể yêu cầu đầu ra của một danh sách được sắp xếp, bắt đầu từ bất kỳ khóa nào, thậm chí là một danh sách không tồn tại (đầu ra sẽ bắt đầu từ khóa thực đầu tiên, xuất hiện sau khóa không tồn tại).

Tất cả các hoạt động này diễn ra cực kỳ nhanh chóng. Trên máy tính ở nhà, tôi nhận được các giá trị lên tới 750 lần chèn/giây trong một quy trình. Trên bộ xử lý đa lõi, các giá trị có thể đạt tới hàng chục triệu chèn/giây.

Tất nhiên, bản thân tốc độ chèn không nói lên nhiều điều. Ví dụ: bạn có thể ghi thông tin vào tệp văn bản rất nhanh - như thế này đồn đại Việc xử lý thị thực hoạt động. Nhưng trong trường hợp toàn cầu, kết quả là chúng tôi nhận được một bộ lưu trữ được lập chỉ mục có cấu trúc, có thể làm việc dễ dàng và nhanh chóng trong tương lai.

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

  • Điểm mạnh lớn nhất của toàn cầu là tốc độ có thể chèn các nút mới.
  • Dữ liệu trên toàn cầu luôn được lập chỉ mục. Đi ngang qua chúng, cả ở một cấp độ và đi sâu vào trong cây, luôn nhanh chóng.

Hãy thêm một số nhánh cấp hai và cấp ba vào toàn cầu.

Set ^a("+7926X", "city") = "Moscow"
Set ^a("+7926X", "city", "street") = "Req Square"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "London"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

Rõ ràng là cây đa cấp có thể được xây dựng dựa trên toàn cầu. Hơn nữa, việc truy cập vào bất kỳ nút nào gần như tức thời do tính năng tự động lập chỉ mục trong quá trình chèn. Và ở bất kỳ cấp độ nào của cây, tất cả các nhánh đều được sắp xếp theo khóa.

Như bạn có thể thấy, thông tin có thể được lưu trữ ở cả khóa và giá trị. Tổng độ dài khóa (tổng độ dài của tất cả các chỉ mục) có thể đạt tới Chuỗi 511, và các giá trị MB MB cho Bộ nhớ đệm. Số cấp độ trong cây (số chiều) là 31.

Một điểm thú vị khác. Bạn có thể xây dựng cây mà không cần chỉ định giá trị của các nút ở cấp trên.

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3

Vòng tròn trống là các nút không được gán giá trị.

Để hiểu rõ hơn về toàn cầu, hãy so sánh chúng với các cây khác: cây vườn và cây tên hệ thống tệp.

Hãy so sánh cây trên toàn cầu với cấu trúc phân cấp quen thuộc nhất với chúng ta: với những cây bình thường mọc trong vườn và trên cánh đồng, cũng như với hệ thống tệp.

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

Như chúng ta thấy ở cây trong vườn, lá và quả chỉ được tìm thấy ở đầu cành.
Hệ thống tệp - thông tin chỉ được lưu trữ ở cuối các nhánh, là tên tệp đủ điều kiện.

Và đây là cấu trúc dữ liệu toàn cầu.

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1Sự khác biệt:

  1. Các nút nội bộ: thông tin trên toàn cầu có thể được lưu trữ ở mọi nút, không chỉ ở cuối các nhánh.
  2. Các nút bên ngoài: Toàn cầu phải có các giá trị được xác định ở cuối các nhánh, trong khi FS và cây trong vườn thì không.



Về mặt nút bên trong, chúng ta có thể nói rằng cấu trúc của toàn cục là một tập hợp siêu cấu trúc của cây tên trong hệ thống tệp và cây vườn. Những thứ kia. Linh hoạt hơn.

Nhìn chung, toàn cầu là cây có thứ tự với khả năng lưu trữ dữ liệu ở mỗi nút.

Để hiểu rõ hơn về công việc của các khối toàn cục, hãy tưởng tượng điều gì sẽ xảy ra nếu những người tạo ra hệ thống tệp sử dụng một cách tiếp cận tương tự như các khối toàn cầu để lưu trữ thông tin?

  1. Việc xóa một tệp trong một thư mục sẽ tự động xóa thư mục đó cũng như tất cả các thư mục nằm phía trên chỉ chứa một thư mục vừa bị xóa.
  2. Sẽ không cần đến thư mục. Đơn giản là sẽ có các tệp có tệp con và tệp không có tệp con. Nếu so với một cái cây bình thường thì mỗi cành sẽ trở thành một quả.

    Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

  3. Những thứ như tệp README.txt có thể không cần thiết. Mọi thứ cần nói về nội dung của thư mục đều có thể được ghi vào chính tệp thư mục. Trong không gian đường dẫn, tên tệp không thể phân biệt được với tên thư mục, do đó có thể lấy được chỉ bằng các tệp.
  4. Tốc độ xóa các thư mục chứa các thư mục con và tập tin lồng nhau sẽ tăng lên đáng kể. Đã nhiều lần trên Habré có bài viết về việc xóa hàng triệu file nhỏ mất bao lâu và khó khăn (1, 2). Tuy nhiên, nếu bạn tạo một hệ thống tệp giả trên toàn cầu, sẽ mất vài giây hoặc một phần nhỏ. Khi tôi thử xóa cây con trên máy tính ở nhà, nó đã loại bỏ 1-96 triệu nút khỏi cây hai tầng trên ổ cứng HDD (không phải SSD) trong 341 giây. Hơn nữa, chúng ta đang nói về việc xóa một phần của cây chứ không chỉ toàn bộ tệp có hình ảnh toàn cục.

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1
Loại bỏ cây con là một điểm mạnh khác của toàn cầu. Bạn không cần đệ quy cho việc này. Điều này xảy ra cực kỳ nhanh chóng.

Trong cây của chúng tôi, điều này có thể được thực hiện bằng lệnh Giết chết.

Kill ^a("+7926X")

Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 1

Để hiểu rõ hơn về những hành động nào có sẵn cho chúng tôi trên toàn cầu, tôi sẽ cung cấp một bảng ngắn.

Các lệnh và hàm cơ bản để làm việc với toàn cục trong COS

Thiết lập
Đặt các nhánh thành một nút (nếu chưa được xác định) và các giá trị nút

đi
Sao chép một cây con

Giết chết
Loại bỏ một cây con

ZKill
Xóa giá trị của một nút cụ thể. Cây con nổi lên từ nút không được chạm vào

$Truy vấn
Hoàn thành việc duyệt cây, đi sâu vào trong cây

$Đơn hàng
Đi qua các nhánh của một nút cụ thể

$Dữ liệu
Kiểm tra xem một nút có được xác định hay không

Tăng $
Tăng nguyên tử một giá trị nút. Để tránh việc đọc và ghi, đối với ACID. Gần đây người ta đề nghị đổi thành Trình tự $

Cảm ơn bạn đã quan tâm, chúng tôi sẵn sàng trả lời câu hỏi của bạn.

Từ chối trách nhiệm: Bài viết này và những bình luận của tôi về nó là quan điểm của tôi và không liên quan đến quan điểm chính thức của InterSystems Corporation.

Extension Globals là thanh kiếm kho báu để lưu trữ dữ liệu. Cây. Phần 2. Bạn sẽ tìm hiểu loại dữ liệu nào có thể được hiển thị trên toàn cầu và những nhiệm vụ nào chúng mang lại lợi ích tối đa.

Nguồn: www.habr.com

Thêm một lời nhận xét