0

Mở rộng ứng dụng bằng cách sử dụng kỹ thuật nhị phân trong SQL,

Giới thiệu

Tôi thường gọi đơn giản kỹ thuật này là “dùng attributes” để mở rộng ứng dụng, với mong muốn dùng 1 cột cố định trong bảng dữ liệu, nhưng có thể cho phép mở rộng liên tục số lượng thuộc tính và giá trị ta muốn lưu, mà không cần phải thay đổi cấu trúc của cơ sở dữ liệu (DB). Tôi gọi cột cố định này là attributes. Với trường attributes trong bảng dữ liệu, ta có thể lưu được rất nhiều thông tin cho các thuộc tính dạng true/false, yes/no,… miễn miền giá trị của thuộc tính mapping trong hai giá trị 0/1.

Mỗi thuộc tính sẽ chiếm 1 bit cố định trong chuỗi nhị phân, tính từ phải qua. Giá trị tại mỗi bit = 0/1 sẽ tương ứng với giá trị thuộc tính là có/không.

Ví dụ:

Ta tổ chức lưu giá trị của một bộ gồm 2 thuộc tính:

  • Tin tức nổi bật: vị trí 1
  • Tin chính: vị trí 2
Tin chính Nổi bật Giá trị nhị phân Giá trị thập phân
0 0 00 0
0 1 01 1
1 0 10 2
1 1 11 3

Như ví dụ trên, ta thấy chỉ với 1 giá trị thập phân, ta đã có thể lưu được thông tin của hai thuộc tính.

level_geek  Phương pháp tính toán

Tuy hiểu ý nghĩa trên hệ nhị phân, nhưng thật sự không cần phải thao tác trên từng bit của nhị phân, bạn có thể tính toán trực tiếp trên hệ thập phân một cách đơn giản và nhanh chóng để bật/tắt một thuộc tính.

Bằng cách gán mỗi thuộc tính một giá trị thập phân tương ứng với vị trí của bit trên hệ nhị phân, lý giải tương ứng giữa giá trị mỗi thuộc tính với vị trí như sau:

Vị trí Thuộc tính Nhị phân Thập phân
1 AAA 000001 1 2^0
2 BBB 000010 2 2^1
3 CCC 000100 4 2^2
4 DDD 001000 8 2^3
5 EEE 010000 16 2^4
6 FFF 100000 32 2^5
7

 

Khi cần tính toán tổ hợp giá trị của các bit bật lên, ta chỉ cần cộng tổng giá trị của các thuộc tính được bật lên yes/true:

Ví dụ:

FFF:32 EEE:16 DDD:8 CCC:4 BBB:2 AAA:1 Nhị phân(tổng) Thập phân(tổng)
True True 100100 36
True True True 011001 25
True True 100001 33
True True True 100101 37

 

level ninja Cách sử dụng

Kiểu dữ liệu trường attributes:

Là kiểu số nguyên không dấu (không âm), số lượng thuộc tính lưu trữ được sẽ bị giới hạn bởi kiểu dữ liệu lưu trữ ở trường attributes, lấy ví dụ theo MySQL:

Type (Unsigned) Max Số lượng thuộc tính
TINYINT 255 7
SMALLINT 65535 15
MEDIUMINT 16777215 23
INT 4294967295 31
BIGINT 18446744073709551615 63

 

Lưu trữ:

Ta cần xác định số lượng thuộc tính sẽ thao tác và fix cứng vị trí các thuộc tính này khi tính toán. (fix cứng có nghĩa là mỗi giá trị gán với một số cấp mũ của 2 như 1,2,4,8,16,… thì phải luôn giữ giá trị đó khi tính toán)

Tính tổng giá trị các thuộc tính và lưu vào trường attr trong bảng dữ liệu, sao cho giá trị lưu trữ không vượt ra ngoài giới hạn kiểu dữ liệu.

Truy vấn:

Làm thế nào để để tìm kiếm trên bản dữ liệu một record theo thuộc tính đã được đánh dấu trước đó? Giả sử một record có giá trị 36 do được đánh dấu 2 thuộc tính FFF (32) và CCC (4), làm thế nào bạn tìm kiếm được record này nếu muốn lấy theo điều kiện record có thuộc tính CCC là true/có?

Câu trả lời rất đơn giản, chỉ cần sử dụng toán tử & trực tiếp trên SQL trong câu lệnh WHERE.

Ví dụ: (với điều kiện tìm kiếm như lời dẫn ở trên)

Vậy khi cần xác định xem một thuộc tính có được bật lên hay không trong nhóm thuộc tính, chỉ cần lấy tổng giá trị AND (toán tử &) với giá trị thuộc tính đó, nếu lớn hơn 0, chắc chắn thuộc tính đó được bật lên.

Bình luận với Facebook

Hoàng Tựa

Yêu thích lập trình web và tạo ra những thứ đẹp đẽ.

Leave a Reply

Your email address will not be published. Required fields are marked *