Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Bạn không thích trình kích hoạt cơ sở dữ liệu? Bạn chỉ không biết cách làm việc với chúng!

Khi thiết kế cơ sở dữ liệu quan hệ lớn, chúng tôi thường đưa ra quyết định tách khỏi dạng bình thường, tức là không chuẩn hóa.

Các lý do cho điều này có thể khác nhau, chẳng hạn như nỗ lực tăng tốc độ truy cập vào dữ liệu được chỉ định, các hạn chế của nền tảng / khuôn khổ / công cụ phát triển đã sử dụng và thiếu kỹ năng của một nhà phát triển / thiết kế cơ sở dữ liệu.

Nói một cách chính xác, việc tham chiếu đến các ràng buộc khung, v.v. thực sự là một nỗ lực để biện minh cho việc thiếu kỹ năng.

Dữ liệu không chuẩn hóa là một lỗ hổng bảo mật, qua đó có thể dễ dàng đưa cơ sở dữ liệu của chúng ta về trạng thái không nhất quán (không tích phân).

Chúng ta có thể làm gì với điều này?

Ví dụ

Trong cơ sở dữ liệu, có một bảng với một số hoạt động tài chính:việc nhận và xử lý tiền trên các tài khoản khác nhau.

Chúng tôi luôn cần biết số dư của tài khoản.

Trong dữ liệu chuẩn hóa, số dư quỹ luôn là giá trị được tính toán. Chúng tôi sẽ tính tổng các khoản thu mà không ghi nợ.

Tuy nhiên, quá tốn kém để tính toán số dư mỗi lần khi có nhiều hoạt động. Vì vậy, nó đã được quyết định lưu trữ số dư thực tế trong một bảng riêng biệt. Làm cách nào để chúng tôi cập nhật dữ liệu trong bảng này?

Giải pháp là "như thường lệ"

Hầu như trong tất cả các hệ thống thông tin mà tôi phải làm việc, nhiệm vụ này được thực hiện bởi một ứng dụng bên ngoài, ứng dụng này thực hiện logic nghiệp vụ. Bạn thật may mắn nếu ứng dụng đơn giản và chỉ có một điểm thay đổi dữ liệu, từ biểu mẫu trong giao diện người dùng. Tuy nhiên, điều gì sẽ xảy ra nếu có một số lần nhập, API, ứng dụng của bên thứ ba, v.v. được thực hiện bởi những người và nhóm khác nhau? Điều gì sẽ xảy ra nếu có một số bảng có tổng thay vì một? Điều gì xảy ra nếu có nhiều hơn một bảng với các phép toán?

Ngày càng khó theo dõi xem nhà phát triển có cập nhật một loạt bảng khi cập nhật hoạt động hay không. Dữ liệu mất tính toàn vẹn. Số dư tài khoản không tương ứng với các nghiệp vụ. Tất nhiên, thử nghiệm phải tiết lộ những tình huống như vậy. Tuy nhiên, thế giới của chúng ta không lý tưởng.

Trình kích hoạt

Thay vào đó, trình kích hoạt được sử dụng để kiểm soát tính toàn vẹn của dữ liệu không chuẩn hóa.

Tôi nghe nói rằng trình kích hoạt làm chậm cơ sở dữ liệu rất nhiều, vì vậy việc sử dụng chúng không có ý nghĩa gì.

Lập luận thứ hai là tất cả logic nằm trong một ứng dụng riêng biệt và việc giữ logic nghiệp vụ ở những nơi khác nhau là không hợp lý.

Hãy tìm hiểu.

Chậm

Trình kích hoạt kích hoạt bên trong giao dịch sửa đổi dữ liệu trong bảng. Giao dịch không thể được hoàn thành cho đến khi trình kích hoạt đã thực hiện các bước cần thiết. Do đó, kết luận là trình kích hoạt phải "nhẹ".

Ví dụ về truy vấn 'nặng' trong trình kích hoạt như sau:

update totals 
set total = select sum(operations.amount) from operations where operations.account = current_account
where totals.account = current_account

Truy vấn đề cập đến bảng có hoạt động và tính tổng số tiền hoạt động cho tài khoản .

Khi cơ sở dữ liệu tăng lên, một truy vấn như vậy sẽ ngày càng tiêu tốn nhiều thời gian và tài nguyên hơn. Tuy nhiên, chúng ta có thể nhận được cùng một kết quả bằng cách sử dụng truy vấn nhẹ thuộc loại sau:

update totals 
set total = totals.total + current_amount
where totals.account = current_account

Khi thêm một hàng mới, trình kích hoạt này sẽ chỉ tăng tổng số theo tài khoản mà không cần tính toán. Tổng số không phụ thuộc vào số lượng dữ liệu trong bảng. Việc tính toán lại tổng số không có ý nghĩa gì vì chúng tôi có thể chắc chắn rằng trình kích hoạt sẽ kích hoạt mỗi lần khi thêm một thao tác mới.

Loại bỏ hoặc sửa đổi các hàng được xử lý theo cách tương tự. Tuy nhiên, các trình kích hoạt kiểu này sẽ không làm chậm hoạt động, đảm bảo tính toàn vẹn và khớp nối dữ liệu.

Mỗi lần tôi gặp phải tình trạng “trễ” khi thêm dữ liệu vào bảng bằng trình kích hoạt, đó là một ví dụ về truy vấn “nặng” như vậy. Trong hầu hết các trường hợp, có thể viết lại nó trong một truy vấn “dễ dàng”.

Logic kinh doanh

Chúng ta phải phân biệt các chức năng cung cấp tính toàn vẹn của dữ liệu với logic nghiệp vụ. Trong mỗi trường hợp, tôi đặt một câu hỏi nếu dữ liệu đã được chuẩn hóa, liệu chúng ta có cần một hàm như vậy không? Nếu tích cực, chức năng là logic nghiệp vụ. Nếu âm, chức năng là cung cấp tính toàn vẹn của dữ liệu. Bạn có thể kết hợp các chức năng này thành các trình kích hoạt.

Tuy nhiên, có ý kiến ​​cho rằng có thể dễ dàng triển khai tất cả logic nghiệp vụ thông qua DBMS, chẳng hạn như PostgreSQL hoặc Oracle.

Tôi hy vọng bài viết này sẽ giúp giảm thiểu số lượng lỗi trong hệ thống thông tin của bạn.

Tất nhiên, tôi còn lâu mới nghĩ rằng mọi thứ được viết ở đây là sự thật cuối cùng. Trong cuộc sống thực, tất nhiên, mọi thứ phức tạp hơn nhiều. Vì vậy, bạn phải đưa ra quyết định trong từng trường hợp cụ thể. Sử dụng tư duy kỹ thuật của bạn!

Tái bút

  • Trong bài viết, tôi đã chú ý đến khía cạnh duy nhất của việc sử dụng trình kích hoạt như một công cụ mạnh mẽ.
  • Cách tiếp cận được mô tả trong bài viết cho phép tránh lập chỉ mục trong Hoạt động bảng này, do đó, có thể tăng tốc quá trình thêm dữ liệu vào bảng này. Ở mức âm lượng lớn, cách tiếp cận này dễ dàng bù đắp thời gian trên trình kích hoạt.
  • Điều quan trọng là phải hiểu chúng ta cần sử dụng những công cụ nào. Trong trường hợp này, bạn sẽ tránh được nhiều vấn đề.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tự động hóa các tác vụ bảo trì cơ sở dữ liệu SQL bằng SQLCMD

  2. Việc sử dụng câu lệnh SQL GROUP BY là gì?

  3. Tính năng mới cho BYOC - Tạm dừng và tiếp tục cụm

  4. Khám phá mức độ ảnh hưởng đến hiệu suất

  5. Quản lý giao dịch với Django 1.6