Tôi có thực sự cần kích hoạt cho cơ sở dữ liệu quan hệ, ví dụ, PostgreSQL?


10

Tôi biết rằng các kích hoạt có thể được sử dụng để xác nhận dữ liệu được lưu trữ để giữ cho cơ sở dữ liệu nhất quán. Tuy nhiên, tại sao không thực hiện xác nhận dữ liệu ở phía ứng dụng trước khi lưu trữ chúng vào cơ sở dữ liệu?

Ví dụ: chúng tôi lưu trữ các máy khách và chúng tôi muốn thực hiện một số xác nhận không thể thực hiện dễ dàng ở cấp độ DDL. https://severalnines.com/blog/postgresql-triggers-and-stored-feft-basics

Một ví dụ khác là kiểm toán.

Cập nhật

Làm thế nào kích hoạt và giao dịch cơ sở dữ liệu làm việc cùng nhau. Ví dụ: nếu tôi muốn thực hiện xác nhận dữ liệu được chèn. Nó được thực hiện bên trong một giao dịch. Điều gì xảy ra trước đó: giao dịch được cam kết hoặc kích hoạt được thực hiện?


However, why not perform validation of data on the application side before storing them into the database?tốt, hai cái này không loại trừ lẫn nhau. Có khả năng bạn sẽ xác nhận những thứ khác nhau ở cả hai bên. Trong khi các xác nhận ở phía ứng dụng là trung tâm kinh doanh, thì các xác nhận trên cơ sở dữ liệu là trung tâm dữ liệu hơn. Hãy suy nghĩ trong một cơ sở dữ liệu được cung cấp bởi một số ứng dụng khác nhau.
Laiv

Bạn có cần phải chèn dữ liệu từ một nguồn bên ngoài đang thực hiện việc đổ dữ liệu vô tâm vào hệ thống của mình không? Nếu vậy, bạn có thể gặp trường hợp bạn cần dữ liệu được chèn ở định dạng không hợp lệ để sửa sau. Trong trường hợp này, kích hoạt sẽ gây ra vấn đề vô tận. Chỉ cần ghi nhớ điều này. Đôi khi bạn không muốn kích hoạt thực thi.
Greg Burghardt

Cập nhật của bạn phải là một câu hỏi về riêng của mình, có lẽ trên SO, nhưng câu hỏi của bạn đã có một câu trả lời trên cơ sở dữ liệu Administrators.SE . Nói tóm lại, ngay cả một trình kích hoạt "sau khi cập nhật" được thực thi trước khi giao dịch được thực hiện và nếu một ngoại lệ được ném vào bên trong trình kích hoạt, nó sẽ gây ra sự phục hồi.
Doc Brown

@GregBurghardt Hầu hết các cơ sở dữ liệu đều có các câu lệnh có thể được sử dụng để vô hiệu hóa các kích hoạt cho các loại hoạt động đó.
Blrfl

1
@Blrfl: Có, nhưng bạn cần lưu ý rằng những kích hoạt đó có thể tạm thời bị vô hiệu hóa cho tất cả người dùng được kết nối, khi bạn chỉ muốn vô hiệu hóa những kiểm tra đó cho phiên hiện tại.
Greg Burghardt

Câu trả lời:


12

Nó phụ thuộc vào loại hệ thống ứng dụng bạn đang xây dựng:

  • nếu bạn đang tạo một hệ thống tập trung vào ứng dụng chỉ chứa một ứng dụng chính, với cơ sở dữ liệu dành riêng cho ứng dụng này và lý tưởng là một nhóm chịu trách nhiệm phát triển ứng dụng và cơ sở dữ liệu song song, bạn có thể giữ tất cả logic xác thực và kiểm toán logic bên trong ứng dụng.

    Lợi ích chính của việc này là bạn không phải phân phối logic nghiệp vụ giữa ứng dụng và db, do đó việc duy trì và phát triển hệ thống thường trở nên dễ dàng hơn. Là một phần thưởng, bạn không buộc ứng dụng quá nhiều vào một loại nhà cung cấp DBMS hoặc DBMS cụ thể. Cách tiếp cận này rõ ràng là bắt buộc nếu ứng dụng của bạn muốn có thể sử dụng hệ thống DB nhẹ không cung cấp trình kích hoạt.

  • Tuy nhiên, nếu bạn tạo một hệ thống có nhiều ứng dụng khác nhau chia sẻ một cơ sở dữ liệu chung và nó không thể hình dung trước được ứng dụng nào sẽ ghi vào đó trong tương lai hoặc nhóm nào sẽ phát triển các ứng dụng để điền dữ liệu vào db trong tương lai, thì nó sẽ tốt hơn là cơ sở dữ liệu của bạn sẽ chịu trách nhiệm đảm bảo tính nhất quán dữ liệu nhất có thể. Và đó là nơi kích hoạt thực sự hữu ích. Trong các hệ thống lớn hơn, các ràng buộc tham chiếu thường không đủ cho việc này, nhưng một trình kích hoạt gọi thủ tục được lưu trữ có thể thực hiện hầu hết mọi loại xác nhận bạn cần.

Một lý do khác để sử dụng các kích hoạt có thể là hiệu suất: trong các mô hình dữ liệu phức tạp, không có gì lạ khi gặp các quy tắc nhất quán phức tạp đòi hỏi phải sử dụng nhiều dữ liệu bổ sung không phải là một phần của bộ làm việc hiện tại có sẵn trong ứng dụng khách. Trước tiên, việc chuyển tất cả các dữ liệu đó qua mạng để thực hiện xác thực ở phía máy khách có thể có tác động hiệu suất đáng chú ý.

Xem thêm bài SE cũ hơn này: Application Logic Vs DB Triggers để làm sạch cơ sở dữ liệu

Vì vậy, hãy tự quyết định loại hệ thống nào bạn đang xây dựng, sau đó bạn có thể đưa ra quyết định thành lập nếu trình kích hoạt có phải là công cụ phù hợp cho trường hợp của bạn hay không.


3

Tôi nghĩ rằng câu hỏi là về trách nhiệm đối với chất lượng dữ liệu.

Câu trả lời phụ thuộc vào cách bạn nhìn thấy hệ thống.

Nếu bạn thấy cơ sở dữ liệu là một dịch vụ độc lập, riêng biệt và tự trị tách biệt với ứng dụng, thì cơ sở dữ liệu có trách nhiệm đảm bảo tính nhất quán và chất lượng của dữ liệu chứa trong đó. Về cơ bản vì cơ sở dữ liệu đó có thể được sử dụng bởi một ứng dụng khác, do đó, nó không thể dựa vào ứng dụng thứ hai có cùng tính nhất quán và hành vi chất lượng. Trong những trường hợp này, cơ sở dữ liệu cần được thiết kế để hiển thị API và hành vi tự trị. Theo quan điểm này, có ít nhất hai ứng dụng, một trong số đó là cơ sở dữ liệu và ứng dụng còn lại là ứng dụng sử dụng nó.

Ngược lại, cơ sở dữ liệu có thể được coi là một dạng tệp phức tạp nằm dưới sự kiểm soát trực tiếp và toàn bộ của ứng dụng. Theo nghĩa này, cơ sở dữ liệu sẽ biến thành một công cụ điều hướng tài liệu và tuần tự hóa thuần túy. Nó có thể cung cấp một số hành vi nâng cao để hỗ trợ truy vấn và bảo trì tài liệu (như JSON hoặc các công cụ XML thực hiện) nhưng sau đó, nó không phải (giống như hầu hết các luồng tệp thực hiện). Trong trường hợp này, trách nhiệm của chương trình là duy trì đúng định dạng và nội dung trong tệp. Theo quan điểm này, có một ứng dụng.

Trong cả hai khung nhìn, câu hỏi tiếp theo là làm thế nào để hỗ trợ việc sử dụng cơ sở dữ liệu dưới dạng một tệp ưa thích hoặc một dịch vụ riêng biệt. Bạn có thể đạt được điều này bằng cách:

  • sử dụng các công cụ mà nền tảng cơ sở dữ liệu cung cấp dưới dạng bảng / lượt xem / thủ tục được lưu trữ / trình kích hoạt / v.v ...
  • gói cơ sở dữ liệu trong một dịch vụ mà tất cả khách hàng phải sử dụng để truy cập cơ sở dữ liệu
  • gói cơ sở dữ liệu trong một thư viện phải được sử dụng bởi tất cả các khách hàng để truy cập dữ liệu.

Mỗi cái đi kèm với những ưu / nhược điểm riêng và sẽ phụ thuộc vào các ràng buộc kiến ​​trúc của môi trường mà hệ thống vận hành bên trong.

Bất kể chế độ xem nào bạn thực hiện, nó luôn trả tiền để xác thực dữ liệu tại các ranh giới.

  • Xác thực các trường trên giao diện người dùng mà người dùng nhập
  • Xác thực yêu cầu mạng / API trước khi nó rời khỏi máy khách
  • Xác thực yêu cầu mạng / API trong máy chủ trước khi làm bất cứ điều gì
  • Xác thực dữ liệu được truyền vào quy tắc kinh doanh
  • Xác thực dữ liệu trước khi được duy trì
  • Xác thực dữ liệu sau khi được truy xuất từ ​​sự kiên trì
  • cứ thế và cứ thế

Bao nhiêu xác nhận được bảo hành tại mỗi ranh giới phụ thuộc vào mức độ rủi ro khi không xác nhận nó.

  • Nhân hai số với nhau?
    • Bạn nhận được số sai có phải là một vấn đề?
  • gọi một thủ tục trên một vị trí bộ nhớ nhất định?
    • Có gì trong vị trí bộ nhớ đó?
    • Điều gì xảy ra nếu đối tượng không tồn tại, hoặc ở trạng thái xấu?
  • sử dụng regex trên chuỗi chứa kanji?
    • Mô-đun regex có thể xử lý unicode không?
    • Regex có thể xử lý unicode không?

Tập trung logic xác thực là tốt, nhưng kích hoạt imho không phải là một cách tốt để thực hiện điều đó. Tôi đã từng làm việc trên một hệ thống trong đó nhiều ứng dụng đều chia sẻ một cơ sở dữ liệu, với tất cả logic xác thực và các tác dụng phụ được triển khai trong cơ sở dữ liệu thông qua các trình kích hoạt và các thủ tục được lưu trữ. Tôi đã có ấn tượng rằng tốt hơn là có một dịch vụ siêu nhỏ trước cơ sở dữ liệu và thực hiện tất cả logic ở đó. Logic không tầm thường trong cơ sở dữ liệu SQL là một mô hình chống.
Joeri Sebrechts

1
@JoeriSebrechts Được rồi, tôi sẽ cắn: tại sao logic không cần thiết trong cơ sở dữ liệu là một phản mẫu, và điều gì làm cho nó trở thành một phản hạt hơn là đưa nó vào một chương trình được duy trì riêng biệt?
Blrfl

@Blrfl Hai lý do, API để truy cập logic trong DB kém hơn API dịch vụ web (khó phiên bản hơn, khó sử dụng hơn, không dễ lưu vào bộ nhớ cache, ...) và cơ sở dữ liệu khiến việc cấu trúc và duy trì sạch sẽ khó khăn hơn codebase được lưu trữ bên trong chúng. Theo kinh nghiệm của tôi, việc lưu trữ logic trong dịch vụ web trước cơ sở dữ liệu sẽ dễ dàng hơn so với bên trong cơ sở dữ liệu đó.
Joeri Sebrechts

@JoeriSebrechts Tôi đồng tình rằng hầu hết các nền tảng Cơ sở dữ liệu cung cấp các công cụ đáng tin cậy để triển khai API đáng tin cậy, hữu ích và có thể phát triển. Theo nhiều cách, nó chắc chắn là một lời mời để cảm thấy rất nhiều nỗi đau. Quan điểm của tôi là về viễn cảnh, nhận ra rằng DB là một tệp ưa thích hoặc nó thực sự là một dịch vụ riêng biệt dẫn đến câu hỏi tiếp theo là làm thế nào để bọc nó để hỗ trợ phong cách sử dụng đó. Tôi sẽ giải thích câu trả lời của tôi để rõ ràng về điều đó.
Kain0_0

2

Không, bạn không bao giờ nên sử dụng kích hoạt để xác nhận.

Cơ sở dữ liệu chỉ chịu trách nhiệm cho tính toàn vẹn của chính nó. Bất kỳ người dùng phải đối mặt với xác nhận nên được thực hiện bởi ứng dụng của bạn.

Cơ sở dữ liệu thực hiện ba cấp độ xác nhận tính toàn vẹn. Đầu tiên là xác nhận cấp trường. Một trường có thể được yêu cầu, nếu không có giá trị (null) thì đó là một lỗi. Nó cũng có thể là một hạn chế kiểm tra; một miền có số lượng giá trị được liệt kê.

Thứ hai là có quan hệ giữa các bảng. Trong một bảng, bạn lưu trữ một hoặc nhiều khóa ngoại, liên quan bảng này với các bảng khác và yêu cầu các giá trị là khóa hợp lệ cho "bảng khác". Hãy nghĩ về một cơ sở dữ liệu địa chỉ, nơi chúng tôi hỗ trợ địa chỉ của các quốc gia khác nhau. Khóa quốc gia trong một địa chỉ phải trỏ đến một quốc gia đã biết. Liệu dữ liệu (ví dụ mã bưu chính) có hợp lệ hay không, không phải là mối quan tâm của kiểm tra tính toàn vẹn này.

Thứ ba và phức tạp nhất là các yếu tố kích hoạt. Như một quy tắc chung, những điều này nên giải quyết (chơi chữ không có ý định) liên quan đến các quy tắc toàn vẹn có điều kiện. Để quay lại ví dụ về địa chỉ: nếu một quốc gia không có mã bưu chính, sẽ là một vấn đề nếu một quốc gia trong danh sách này có mã bưu chính. Vì vậy, kiểm tra sẽ là: nếu quốc gia này không có mã bưu chính, trường mã bưu chính sẽ là null.

Xác nhận là mối quan tâm của ứng dụng. Thực tế là một mã bưu chính của Đức chỉ bao gồm các chữ số là một kiểm tra mà ứng dụng nên thực hiện, chứ không phải cơ sở dữ liệu. Dòng này là một dòng mỏng, vì vậy bạn có thể cần một số suy nghĩ / thảo luận trong một số trường hợp nếu một cái gì đó nên được kích hoạt (bảo vệ tính toàn vẹn của cơ sở dữ liệu của bạn) hoặc trong ứng dụng (người dùng phải đối mặt với xác nhận).


Chỉ muốn thêm rằng nếu OP cần thêm quy tắc xác thực acomplex cần có trong cơ sở dữ liệu, anh ta luôn có thể sử dụng các thủ tục được lưu trữ như một sự thay thế an toàn hơn.
Borjab

@Borjab: Có thể xác nhận như là giữ cho cơ sở dữ liệu chính xác. Nhưng người dùng phải đối mặt với xác nhận? Số
Menno Hölscher

1
Tuyên bố đầu tiên của bạn nói rằng "không bao giờ sử dụng kích hoạt để thực hiện xác nhận" , nhưng bên dưới bạn viết, "vâng, bạn có thể sử dụng kích hoạt cho một số loại xác thực nhất định và không rõ ràng nơi để vẽ đường thẳng". Điều này đọc khá mâu thuẫn. Tôi khuyên bạn nên xóa câu đầu tiên của bạn, điều đó sẽ cải thiện câu trả lời của bạn rất nhiều. Ồ, và câu cuối cùng của bạn không trả lời câu hỏi cập nhật OP, vì "trước / sau" không liên quan gì đến giao dịch. Tôi muốn giới thiệu để xóa nó là tốt. (xem bình luận của tôi bên dưới câu hỏi OP).
Doc Brown

@DocBrown Sự khác biệt là giữa bảo vệ cơ sở dữ liệu khỏi tham nhũng và xác thực người dùng phải đối mặt. Vì vậy, trong "bất kỳ xác nhận nào nữa" tôi đề cập đến xác thực đối mặt với người dùng. Làm thế nào tôi có thể làm cho sự khác biệt này rõ ràng hơn? Khi bắt đầu, tôi đã loại bỏ "hơn nữa".
Menno Hölscher

2
Nó là hoàn toàn tốt để làm xác nhận trong cơ sở dữ liệu. Cũng như nó là tốt để làm điều đó trong ứng dụng. Cả hai đều có lợi thế của họ. Thực hiện xác nhận của bạn trong ứng dụng có nghĩa là bạn phải cực kỳ cẩn thận mỗi khi bạn chạy SQL mà không cần ORM, điều cần thiết cho mọi ứng dụng phức tạp.
Qwertie

1

Kiểm toán là một ví dụ cổ điển về việc sử dụng các kích hoạt một cách hiệu quả. Tôi đã tìm thấy một số lỗi do người kiểm tra (chuyển một khách hàng từ cấp độ dịch vụ này sang cấp độ khác) nhờ vào bảng Kiểm toán được kích hoạt bởi các trình kích hoạt. Tôi rất khuyên bạn nên sử dụng kích hoạt để kiểm toán.

Xác thực có thể được thực hiện ở cấp độ giao diện người dùng, nhưng tôi đã thấy các lỗi lạ trong cơ sở dữ liệu mà tôi đã xử lý (những người sinh năm 3000, v.v.) và vì một số trong số đó tôi tự làm nên tôi khuyên bạn nên có thêm một lớp xác nhận trong cơ sở dữ liệu, chỉ trong trường hợp. Tất nhiên, những loại lỗi đó có thể tránh được bằng các ràng buộc kiểm tra và nhiều lần chúng có hiệu quả hơn (trong MS SQL, chúng là phương pháp ưa thích; luôn kiểm tra tài liệu).


1

Bởi vì câu hỏi là về việc chúng ta có thực sự cần kích hoạt cho cơ sở dữ liệu quan hệ hay không, đây là một số trường hợp sử dụng khác để sử dụng kích hoạt:

  1. Đối với kiểm toán như được mô tả trong các câu trả lời khác.
  2. Kiểm toán theo nghĩa rộng hơn: nếu mục nhập cơ sở dữ liệu bị thay đổi, trình kích hoạt có thể ghi lại sự kiện để xử lý bài viết không điển hình, ví dụ: xuất hàng đêm sang ứng dụng khác.
  3. Kích hoạt cho quan điểm: kích hoạt có thể được xác định instead of. Với nghĩa này, người ta có thể chèn, cập nhật và xóa các mục từ chế độ xem. Các kích hoạt có thể trải rộng các hành động này trên nhiều bảng. Đây là một cách để cung cấp chế độ xem hạn chế mà không để lộ chi tiết của các bảng bên dưới.
  4. Để lưu một cách rõ ràng các vòng quay cơ sở dữ liệu: giả sử mối quan hệ N: M giữa bảng A và B và bảng trung gian R. Bạn có thể xác định các ràng buộc khóa ngoài từ R đến A cũng như B chỉ định rằng mục nhập trong R sẽ bị hủy nếu mục tương ứng trong B bị xóa. Tuy nhiên, logic nghiệp vụ đôi khi yêu cầu các mục trong A phải có ít nhất một quan hệ với mục trong B. Trong trường hợp này, một trình kích hoạt xóa R có thể giúp thực thi logic này: nếu cho mục trong A mục cuối cùng trong R bị xóa sau đó kích hoạt có thể xóa A. Trong chế độ xem trung tâm ứng dụng, ít nhất hai vòng quay là cần thiết. Đây là một ví dụ để xác nhận. Các ví dụ khác có thể hiểu được: bên cạnh các trường hợp sử dụng (1), (2),
  5. Tin cậy: đôi khi quản trị viên cơ sở dữ liệu thay đổi các mục trên dòng lệnh không sử dụng ứng dụng của bạn. Quản trị viên làm việc cẩn thận và biết những gì họ làm. Tuy nhiên, đôi khi họ có thể sai. Nếu tính nhất quán là quan trọng, một kích hoạt là vành đai an toàn của họ.

Là một logic kinh doanh hạn chế được phân phối giữa các lớp và đây là một bất lợi lớn cho bảo trì. Như một tác giả khác đã viết, đó là một ranh giới mỏng giữa ứng dụng và cơ sở dữ liệu và sự lựa chọn không phải lúc nào cũng rõ ràng. Ý kiến ​​cá nhân của tôi là các yếu tố gây ra gánh nặng cho các nhà phát triển. Họ có thể tiết kiệm thời gian trong phát triển. Chắc chắn họ tăng cường thời gian sử dụng vì chúng tăng hiệu suất qua các kết nối mạng chậm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.