Tại sao các ràng buộc được áp dụng trong cơ sở dữ liệu chứ không phải là mã?


21

Tại sao các ràng buộc được áp dụng trong Cơ sở dữ liệu? Nó sẽ không linh hoạt hơn để đặt nó trong mã?

Tôi đang đọc một cuốn sách dành cho người mới bắt đầu triển khai cơ sở dữ liệu, vì vậy tôi đang hỏi đây là người mới bắt đầu. Giả sử tôi đã thiết kế một cơ sở dữ liệu, bao gồm mô hình thực thể này:

 entity type    |   sub-types
----------------+--------------------------------------------
   Person       |   Employee, Student,       ...
   Student      |   Graduate, Undergraduate, ...
   Employee     |   Teacher,  Administrator, ...

Các ràng buộc hiện tại:

  1. Một người đã đăng ký trên hệ thống chỉ có thể là Sinh viên hoặc Nhân viên.
  2. Thực thể cá nhân đòi hỏi tính duy nhất của số xã hội, mà chúng tôi cho rằng mỗi người chỉ giữ một số duy nhất (hay còn gọi là khóa chính đủ tốt ). (xem # 1)

Sau đó, chúng tôi quyết định loại bỏ số 1: Nếu một ngày, trường đại học quyết định rằng Teacher(loại Employeephụ) cũng có thể Student, tham gia các khóa học trong thời gian rảnh, việc thay đổi thiết kế cơ sở dữ liệu có thể có hàng ngàn, hàng triệu, hàng tỷ, hàng trăm mục thay vì chỉ thay đổi logic trong mã: chỉ là phần không cho phép một người được đăng ký cả khi là sinh viên và nhân viên.

(Điều đó rất không thể nhưng tôi không thể nghĩ gì khác ngay bây giờ. Rõ ràng là có thể).

Tại sao chúng ta quan tâm đến các quy tắc kinh doanh trong thiết kế cơ sở dữ liệu hơn là trong mã?

# 1: Một lưu ý 7 năm sau, một ví dụ thực tế:
Tôi đã thấy một chính phủ vì một sai lầm, các SSN được ban hành đã bị trùng lặp: nhiều người, cùng một SSN. Những người thiết kế DB ban đầu chắc chắn đã mắc sai lầm khi không áp dụng ràng buộc duy nhất này trong cơ sở dữ liệu. (và sau đó là một lỗi trong ứng dụng gốc? nhiều ứng dụng sử dụng cơ sở dữ liệu dùng chung và không đồng ý đặt ở đâu, kiểm tra và thực thi các ràng buộc? ...).
Lỗi này sẽ tồn tại trong hệ thống tất cả hệ thống được phát triển sau đó dựa vào cơ sở dữ liệu của hệ thống ban đầu đó, trong nhiều năm tới. Đọc các câu trả lời ở đây tôi đã học cách áp dụng tất cả các ràng buộc, càng nhiều trong số chúng càng tốt, một cách khôn ngoan (không mù quáng) trong cơ sở dữ liệu để thể hiện thế giới thực ngoài kia tốt nhất có thể.


2
Chủ yếu chúng tôi quan tâm đến các quy tắc kinh doanh được thực thi và cách tốt nhất cho điều đó là gì.
ypercubeᵀᴹ

3
Bạn thực sự đang trình bày một ví dụ rất tệ về những ràng buộc được sử dụng cho, vì tính linh hoạt của các thực thể của bạn và khả năng mở rộng của cơ sở dữ liệu, hầu hết được xác định bằng chuẩn hóa. Phải nói rằng, các ràng buộc là biện pháp bảo vệ cuối cùng chống lại mọi dữ liệu bị hỏng khi vào cơ sở dữ liệu, ngay cả khi ứng dụng bị lỗi, ngay cả khi một ứng dụng mới được phát triển, ngay cả khi API bên ngoài được thêm vào, ngay cả khi ai đó chỉnh sửa DB trực tiếp. Các ràng buộc bảo vệ cơ sở dữ liệu, trên hết logic kinh doanh cũng sẽ phải tự làm mọi thứ trước khi cố gắng truy cập DB.
Niels Keurentjes

3
Thật ra, là một sinh viên tốt nghiệp, tôi được coi là cả Sinh viên, Nhân viên và Giáo viên. Vì vậy, ví dụ của bạn không thực sự khả thi.
Winston Ewert

4
Bạn không bao giờ nên thiết kế cơ sở dữ liệu trên các đối tượng trong ứng dụng của mình. Bạn cũng sẽ thiết kế nó như một người, sau đó có một bảng liên quan để khử các vai trò của mọi người. Sau đó, vấn đề không xảy ra khi bạn thực hiện bảng cho các vai trò vì mọi người có thể có nhiều vai trò. Nếu bạn muốn chỉ có một người đóng vai trò, thì bạn giới hạn bảng sao cho peopleID là duy nhất. Khi bạn muốn thay đổi mà loại bỏ ràng buộc teh.
HLGEM

Đối tượng <-> Ánh xạ quan hệ là một nghệ thuật.
Thorbjørn Ravn Andersen

Câu trả lời:


34

Một số ràng buộc được thi hành tốt nhất trong cơ sở dữ liệu và một số ràng buộc được thi hành tốt nhất trong ứng dụng.

Các ràng buộc được thi hành tốt nhất trong cơ sở dữ liệu thường ở đó vì chúng là cơ bản cho cấu trúc của mô hình dữ liệu, chẳng hạn như một ràng buộc khóa ngoài để đảm bảo rằng sản phẩm có giá trị category_id.

Các ràng buộc được thi hành trong một ứng dụng có thể không phải là cơ bản cho mô hình dữ liệu, chẳng hạn như tất cả các sản phẩm FooBar phải có màu xanh - nhưng sau đó ai đó có thể quyết định rằng FooBars cũng có thể có màu vàng. Đây là logic ứng dụng không thực sự cần có trong cơ sở dữ liệu, mặc dù bạn có thể tạo một coloursbảng riêng và cơ sở dữ liệu có thể yêu cầu sản phẩm tham chiếu một mục hợp lệ từ bảng đó. NHƯNG quyết định rằng bản ghi duy nhất colourscó giá trị vẫnblue sẽ đến từ một nơi nào đó bên ngoài cơ sở dữ liệu.

Xem xét những gì sẽ xảy ra nếu bạn không có ràng buộc trong cơ sở dữ liệu và yêu cầu tất cả chúng phải được thi hành trong ứng dụng. Điều gì sẽ xảy ra nếu bạn có nhiều ứng dụng cần thiết để làm việc với dữ liệu? Dữ liệu của bạn sẽ trông như thế nào nếu các ứng dụng khác nhau quyết định thực thi các chống chỉ định khác nhau?

Ví dụ của bạn cho thấy một tình huống có thể có ích hơn khi có các ràng buộc trong ứng dụng hơn là trong cơ sở dữ liệu, nhưng có lẽ có một vấn đề cơ bản với mô hình dữ liệu ban đầu quá hạn chế và không linh hoạt?


Vì vậy, theo câu trả lời này, quy tắc <a person chỉ có thể tồn tại trong bảng phụ của Sinh viên hoặc chỉ trong bảng phụ của Nhân viên> nên được áp dụng trong mã và Cơ sở dữ liệu có <Loại phụ Sinh viên / Nhân viên phải hợp lệ người> ràng buộc. Tôi có đúng không (Đó là ví dụ về cuốn sách). cảm ơn.
hkoosha

2
@loolooyyyy: Vâng, tôi nghĩ đó là chính xác. Nếu cơ sở dữ liệu thực thi quy tắc đầu tiên (rằng một người chỉ có thể là học sinh hoặc nhân viên) thì tình huống bạn mô tả (trong đó một nhân viên muốn đăng ký lớp học) là không thể bởi vì: người đó không thể là cả hai, và đó không phải là thậm chí có thể tạo bản ghi "người" thứ hai vì họ không thể chia sẻ Số An sinh Xã hội được cho là do bên thứ ba (chẳng hạn như chính phủ). Tất nhiên, mô hình dữ liệu hạn chế quá mức này có thể hoạt động trong một số trường hợp ...
FrustratedWithFormsDesigner

2
@loolooyyyy: Một cách khác để sử dụng mô hình dữ liệu gốc và vẫn cho phép giáo viên là sinh viên có thể có một bảng khác được gọi teachers_as_studentslà một kiểu con khác Studentsvà có khóa ngoại mới Teachers, và khóa chính được tạo bởi hệ thống , thay vì Xã hội Số bảo mật. Theo cách này, một "học sinh" thực sự là bí danh của một giáo viên để giáo viên vẫn có thể đăng ký tham gia một lớp học. Thật khó để nói chắc chắn điều này sẽ hoạt động tốt như thế nào mà không nhìn thấy toàn bộ mô hình dữ liệu.
Thất vọngWithFormsDesigner

2
Tôi đánh giá thấp điều này. Không có thời gian khi một ràng buộc chỉ được thi hành tốt nhất trong ứng dụng . Giọng điệu của câu trả lời này có trọng số không đúng.
Evan Carroll

3
@FrustratedWithFormsDesigner chắc chắn, đó thực sự là con đẻ của một ràng buộc khóa ngoại. Giả sử bạn có ba máy khách của các phiên bản / bản dựng khác nhau của điểm truy cập db, bạn sẽ làm gì khi bạn ngừng vận chuyển sản phẩm đó màu đỏ? Nơi nào bạn sẽ lưu trữ danh sách các kết hợp màu sắc có thể ? Gợi ý: Tôi đã có một nơi tập trung cho bạn. Và nếu bạn tạo bảng color_products, và color, bạn có thể sẽ có thể tạo các trình đơn thả xuống bổ sung dễ dàng hơn - hầu hết các trình tải IDE / lược đồ, hỗ trợ theo các khóa.
Evan Carroll

35

Bởi vì:

  1. Tôi muốn tất cả dữ liệu trong cơ sở dữ liệu phải chịu cùng một ràng buộc, không chỉ dữ liệu mới phải chịu các ràng buộc trong phiên bản mã đang chạy ngày hôm nay.
  2. Tôi muốn các ràng buộc khai báo, không phải các ràng buộc lập trình.
  3. Dữ liệu trong cơ sở dữ liệu thường tồn tại lâu hơn mã được viết để tương tác với nó ngày nay. Và dữ liệu đó - không phải mã - là tài sản của tổ chức.
  4. Mã của tôi trở nên đơn giản hơn nhiều khi tôi biết rằng tất cả dữ liệu phải chịu các ràng buộc nghiêm ngặt. Tôi không còn phải xem xét các trường hợp đặc biệt mà tôi biết rằng cơ sở dữ liệu đảm bảo là không thể.

Chỉ là một số lý do quan trọng đối với tôi.


4
Bán liên quan đến (1) và (3): lỗi trong mã ứng dụng có thể được sửa, lỗi trong dữ liệu của bạn thường không thể sửa chữa được.
mu quá ngắn

17

Dữ liệu có thể sẽ tồn tại lâu hơn mã ứng dụng. Nếu quy tắc rất quan trọng đối với dữ liệu hữu ích theo thời gian (như các ràng buộc khóa ngoài giúp giữ tính toàn vẹn của dữ liệu), thì nó phải nằm trong cơ sở dữ liệu. Nếu không, bạn có nguy cơ mất các ràng buộc trong một ứng dụng mới truy cập vào cơ sở dữ liệu. Không chỉ nhiều ứng dụng đánh vào cơ sở dữ liệu (Bao gồm một số ứng dụng có thể không nhận ra có quy tắc dữ liệu quan trọng) mà một số trong số chúng như nhập dữ liệu hoặc ứng dụng báo cáo có thể không thể sử dụng lớp dữ liệu được thiết lập trong ứng dụng nhập dữ liệu chính. Thẳng thắn mà nói, khả năng có lỗi trong ràng buộc cao hơn nhiều trong mã ứng dụng theo kinh nghiệm của tôi.

Theo ý kiến ​​cá nhân của tôi (dựa trên hơn 30 năm xử lý dữ liệu và kinh nghiệm với hàng trăm cơ sở dữ liệu khác nhau được sử dụng cho nhiều mục đích khác nhau), bất kỳ ai không đặt các điều khoản trong cơ sở dữ liệu nơi họ thuộc về sẽ có dữ liệu kém. Đôi khi dữ liệu xấu đến mức không thể sử dụng được. Điều này đặc biệt đúng khi bạn có dữ liệu tài chính / quy định cần đáp ứng các tiêu chí nhất định để kiểm toán.


17

Hầu hết các ràng buộc toàn vẹn tham chiếu được triển khai bên ngoài cơ sở dữ liệu có thể bị đánh bại, vì vậy nếu bạn muốn dữ liệu của mình được đảm bảo tính toàn vẹn mọi lúc thì bạn phải áp dụng các ràng buộc trong cơ sở dữ liệu. Dừng lại hoàn toàn, thế thôi.

Thông thường, các ràng buộc ở cấp ứng dụng bị đánh bại mặc dù cơ chế thống nhất đọc cơ sở dữ liệu, theo đó các phiên không thể xem dữ liệu của các phiên khác cho đến khi được cam kết.

Ví dụ: hai phiên có thể cố gắng chèn cùng một giá trị vào một cột được dự định là duy nhất. Cả hai có thể kiểm tra cùng một lúc rằng giá trị chưa tồn tại, cả hai có thể chèn giá trị của chúng và cả hai có thể cam kết. Một ràng buộc duy nhất được thực hiện trong cơ sở dữ liệu sẽ không để điều này xảy ra.

Điều này không phải là không biết đối với các nhà thiết kế ngôn ngữ ứng dụng. Đọc phần 3.10 tính duy nhất trong Hướng dẫn về Ruby trên Rails: Xác thực và gọi lại bản ghi hoạt động

Trình trợ giúp này xác nhận rằng giá trị của thuộc tính là duy nhất ngay trước khi đối tượng được lưu. Nó không tạo ra một ràng buộc duy nhất trong cơ sở dữ liệu, do đó, có thể xảy ra việc hai kết nối cơ sở dữ liệu khác nhau tạo ra hai bản ghi có cùng giá trị cho một cột mà bạn dự định là duy nhất. Để tránh điều đó, bạn phải tạo một chỉ mục duy nhất trong cơ sở dữ liệu của bạn.


16

Lợi ích của các ràng buộc được thi hành bởi cơ sở dữ liệu:

Tính đơn giản - Khai báo một ràng buộc đơn giản hơn đáng kể so với khai báo một ràng buộc và viết mã sẽ thực thi khai báo đó.

Độ chính xác - Mã bạn không viết sẽ không bao giờ có lỗi mà bạn đã tạo. Các nhà cung cấp cơ sở dữ liệu dành thời gian để đảm bảo mã ràng buộc của họ là chính xác, vì vậy bạn không cần phải làm vậy.

Tốc độ - Ứng dụng của bạn không bao giờ có thể có nhiều bản phân phối hơn cơ sở dữ liệu mà nó dựa trên. Các nhà cung cấp cơ sở dữ liệu dành thời gian để đảm bảo mã ràng buộc của họ hiệu quả, do đó bạn không cần phải làm vậy. Bản thân cơ sở dữ liệu cũng có quyền truy cập dữ liệu nhanh hơn ứng dụng có thể có bất kể hiệu quả đến đâu.

Sử dụng lại - Bạn có thể bắt đầu với một ứng dụng trên một nền tảng, nhưng nó có thể không giữ nguyên như vậy. Nếu bạn cần truy cập dữ liệu từ một HĐH khác, phần cứng khác hoặc từ giao diện thoại thì sao? Bằng cách có các ràng buộc trong cơ sở dữ liệu, mã này không bao giờ phải được viết lại cho nền tảng mới và không bao giờ phải sửa lỗi cho độ chính xác hoặc được định hình cho tốc độ.

Tính đầy đủ - Các ứng dụng thực thi các ràng buộc khi dữ liệu được nhập vào cơ sở dữ liệu và sẽ cần thêm nỗ lực để xác minh dữ liệu cũ là chính xác hoặc để thao tác dữ liệu đã có trong cơ sở dữ liệu.

Tuổi thọ - Nền tảng cơ sở dữ liệu của bạn có thể sẽ tồn tại lâu hơn bất kỳ ứng dụng cụ thể nào.


11

Tại sao các ràng buộc được áp dụng trên máy chủ? Bởi vì bạn không thể ép buộc kẻ xấu sử dụng khách hàng của mình.

Để làm rõ, nếu bạn chỉ thực hiện xử lý quy tắc kinh doanh trong ứng dụng khách của mình thì ai đó sử dụng công cụ khác có thể kết nối với máy chủ cơ sở dữ liệu và làm bất cứ điều gì họ muốn mà không bị ràng buộc bởi bất kỳ quy tắc kinh doanh và kiểm tra tính toàn vẹn nào của bạn. Ngăn chặn bất cứ ai sử dụng một công cụ tùy ý ở bất cứ đâu trên mạng là rất khó khăn.

Nếu bạn thực hiện kiểm tra tính toàn vẹn trên máy chủ cơ sở dữ liệu thì mọi nỗ lực truy cập dữ liệu, bất kể công cụ nào, sẽ bị ràng buộc bởi các quy tắc của bạn.


10

Một số câu trả lời tuyệt vời ở đây và có nguy cơ lặp lại những suy nghĩ khác:

  • SSN không nhất thiết là duy nhất. Heck, SSN thậm chí không phải lúc nào cũng được biết đến, và trong một số trường hợp, nó không tồn tại (chưa). SSN có thể được sử dụng lại và không phải tất cả nhân viên hoặc học sinh đều có thể có SSN. Đây là ngoại vi của câu hỏi nhưng chứng minh rằng, cho dù bạn thực thi các ràng buộc của mình ở đâu, bạn cần hiểu mô hình dữ liệu và miền khá kỹ lưỡng để đưa ra quyết định về quy tắc kinh doanh.
  • Cá nhân tôi thích các ràng buộc càng gần dữ liệu càng tốt. Lý do rất đơn giản là không phải ai cũng sẽ sử dụng mã ứng dụng để thay đổi dữ liệu trong cơ sở dữ liệu. Nếu bạn thực thi các quy tắc kinh doanh của mình ở cấp ứng dụng và tôi sẽ chạy một UPDATEtuyên bố trực tiếp đối với cơ sở dữ liệu, làm thế nào để ứng dụng của bạn ngăn chặn một thay đổi không hợp lệ? Một vấn đề khác với các quy tắc kinh doanh trong ứng dụng là việc biên dịch lại / triển khai lại có thể khó khăn, đặc biệt là đối với các ứng dụng phân tán, có thể không phải ai cũng sẽ nhận được bản cập nhật cùng một lúc. Và cuối cùng, việc thay đổi các quy tắc kinh doanh trong ứng dụng hoàn toàn không có gì về dữ liệu đã tồn tại vi phạm các quy tắc mới - nếu bạn thêm ràng buộc mới vào dữ liệu, bạn cần sửa dữ liệu.
  • Bạn có thể biện minh cho nhiều kiểm tra dự phòng ở nhiều cấp độ khác nhau. Tất cả điều này phụ thuộc vào tính linh hoạt của các phương pháp triển khai, khả năng thay đổi và mức độ khó để đồng bộ hóa thay đổi quy tắc kinh doanh trong cơ sở dữ liệu và các lớp khác. Một lập luận thuyết phục cho việc lặp lại kiểm tra ở lớp ứng dụng là bạn có khả năng ngăn chặn một chuyến đi khứ hồi đến cơ sở dữ liệu chỉ để không bị ràng buộc ở đó (tùy thuộc vào bản chất của ràng buộc và liệu nó có phụ thuộc vào dữ liệu hiện có hay không). Nhưng nếu tôi phải chọn cái này hay cái kia tôi sẽ đặt nó vào cơ sở dữ liệu vì những lý do trên.

Trong trường hợp bạn đề cập rõ ràng, nơi bạn đột nhiên cho phép thứ gì đó không được phép trước đây, đây thực sự không phải là vấn đề - bạn loại bỏ bất kỳ ràng buộc nào đã thực thi nó, bất kể nơi đó tồn tại. Trong trường hợp ngược lại, khi đột nhiên giáo viên không còn được phép là sinh viên, bạn có khả năng có một loạt dữ liệu để dọn dẹp, một lần nữa bất kể nơi nào có ràng buộc tồn tại trước đó.


9
  1. Cơ sở dữ liệu có thể kiểm tra các ràng buộc một cách hiệu quả. Tốt hơn mã.

  2. Ràng buộc toàn vẹn giúp cơ sở dữ liệu tìm kế hoạch thực hiện hiệu quả

  3. Ứng dụng nhìn thấy quan điểm nhất quán, do đó nó khó có thể đảm bảo tính duy nhất. Trong khi cơ sở dữ liệu cũng có thể thấy dữ liệu không cam kết.


8

Câu trả lời ngắn ... để bảo vệ tính toàn vẹn dữ liệu (nghĩa là tính chính xác và hợp lệ).

Một ngoại lệ ...
Nếu cơ sở dữ liệu chỉ lưu trữ dữ liệu của một ứng dụng cho một người dùng, chẳng hạn như trong hầu hết các cơ sở dữ liệu Sqlite, nó có thể không cần các ràng buộc. Trên thực tế, họ thường không làm như vậy, để giữ thời gian truy cập nhanh đến mức không thể đo lường được.

Đối với mọi thứ khác ...
Cơ sở dữ liệu luôn phục vụ hai thạc sĩ mà tôi sẽ gọi cho biên tập viênngười dùng .

Các biên tập viên chủ yếu đưa dữ liệu vào cơ sở dữ liệu và truy xuất dữ liệu một hoặc một số lượng nhỏ các bản ghi tại một thời điểm. Mối quan tâm chính của họ là truy cập nhanh, chính xác vào tất cả các phần dữ liệu liên quan và lưu trữ nhanh chóng, đáng tin cậy về các thay đổi của họ.

Người dùng chủ yếu lấy dữ liệu và quan tâm nhất đến việc truy cập nhanh vào thông tin chính xác không thể nghi ngờ. Họ thường cần nhiều số lượng, tập hợp và danh sách khác nhau được sử dụng trong các ngăn xếp dày đặc biểu tượng của các bản in giấy màu xanh lá cây nhưng thường xuất hiện trên các trang web ngày nay.

Các dự án phát triển cơ sở dữ liệu hầu như luôn được bắt đầu theo lệnh của Người dùng , nhưng thiết kế được điều khiển bởi nhu cầu nhập dữ liệu và ghi lại tại một thời điểm của Biên tập viên . Do đó, các nhà phát triển thiếu kinh nghiệm thường đáp ứng nhu cầu tức thời về tốc độ (chủ yếu là phát triển ) bằng cách không đặt các ràng buộc trong cơ sở dữ liệu.

Nếu một và chỉ một ứng dụng sẽ được sử dụng để thay đổi dữ liệu trong toàn bộ vòng đời của cơ sở dữ liệu và ứng dụng đó được phát triển bởi một hoặc một số ít cá nhân phối hợp tốt, thì thể dựa vào đó là hợp lý các ứng dụng để đảm bảo tính toàn vẹn dữ liệu.

Tuy nhiên, nhiều như chúng ta giả vờ có thể dự đoán tương lai, chúng ta không thể.

Nỗ lực sản xuất bất kỳ cơ sở dữ liệu nào là quá quý giá để vứt bỏ nó. Giống như một ngôi nhà, cơ sở dữ liệu sẽ được mở rộng, thay đổi và cải tạo nhiều lần. Ngay cả khi nó được thay thế hoàn toàn, tất cả dữ liệu sẽ được di chuyển sang cơ sở dữ liệu mới trong khi vẫn giữ nguyên tất cả các quy tắc và mối quan hệ kinh doanh cũ.

Các ràng buộc thực hiện các quy tắc và mối quan hệ đó dưới dạng khai báo ngắn gọn trong chính công cụ cơ sở dữ liệu nơi chúng có thể dễ dàng truy cập. Không có chúng, các nhà phát triển tiếp theo sẽ phải rót qua các chương trình ứng dụng để thiết kế ngược các quy tắc đó. Chúc may mắn!

Nhân tiện, đây chính xác là những gì các lập trình viên COBOL của máy tính lớn phải làm vì những cơ sở dữ liệu khổng lồ đó thường được tạo ra trước khi chúng ta có các công cụ và ràng buộc quan hệ. Ngay cả khi được di chuyển sang một hệ thống hiện đại như IBM của IBM, các ràng buộc đôi khi không được thực hiện đầy đủ vì logic của các quy tắc cũ, có lẽ được thể hiện trong một loạt các chương trình "bó" của COBOL, có thể bị biến thành không thực tế để chuyển đổi. Thay vào đó, các công cụ tự động có thể được sử dụng để chuyển đổi COBOL cũ thành phiên bản mới hơn với giao diện cho công cụ quan hệ mới và với một chút tinh chỉnh, tính toàn vẹn dữ liệu được giữ nguyên ... cho đến khi một ứng dụng mới được viết một cách tinh vi mọi thứ và công ty bị lôi kéo ra tòa vì đã tịch thu hàng ngàn chủ sở hữu nhà mà họ không nên có.


7

Ngoài những bình luận khác ...

Nếu / khi bạn có cơ sở dữ liệu trong đó bất kỳ bảng đã cho nào có thể được cập nhật bởi một hoặc nhiều ứng dụng hoặc đường dẫn mã thì đặt các ràng buộc thích hợp trong cơ sở dữ liệu có nghĩa là các ứng dụng của bạn sẽ không sao chép mã ràng buộc "giống nhau". Điều này có lợi cho bạn bằng cách đơn giản hóa việc bảo trì (giảm số lượng địa điểm thay đổi nếu / khi có thay đổi mô hình dữ liệu) và đảm bảo rằng các ràng buộc được áp dụng nhất quán bất kể ứng dụng cập nhật dữ liệu.


5

Cá nhân, tôi nghĩ việc tạo và thay đổi các ràng buộc dễ dàng hơn so với việc tạo các trình kích hoạt, chẳng hạn, đó sẽ là một cách để thực thi quy tắc kinh doanh của bạn bằng mã nguồn.

Các trình kích hoạt cũng ít có khả năng mang theo hơn, vì chúng thường được viết bằng các ngôn ngữ cụ thể của nhà cung cấp, chẳng hạn như PL / SQL.

Nhưng nếu các ràng buộc không đáp ứng nhu cầu của bạn, bạn luôn có thể sử dụng các kích hoạt để thực thi các quy tắc kinh doanh của mình.


5
Ngoài ra kích hoạt không đảm bảo tính toàn vẹn, do các vấn đề nhất quán đọc.
David Aldridge

3

Chúng phải luôn được áp dụng trong cơ sở dữ liệu trước vì,

  1. Cơ sở dữ liệu đảm bảo tính toàn vẹn giữa các khách hàng khác nhau. Bạn có thể có các máy khách khác nhau trên các nền tảng khác nhau truy cập cơ sở dữ liệu. Các ràng buộc trong cơ sở dữ liệu không có rủi ro về vấn đề toàn vẹn khi bạn tạo một ứng dụng khách mới. Điều này giúp bạn không phải Q / A các ràng buộc của bạn trong trường hợp viết lại hoặc một điểm truy cập bổ sung.
  2. Cơ sở dữ liệu có DSL để xây dựng các ràng buộc: SQL DDL!
  3. Cơ sở dữ liệu cung cấp quyền truy cập vào các ràng buộc đó trong danh mục hệ thống để ORM hoặc "trình tải lược đồ" thích hợp có thể đọc các ràng buộc đó và đưa chúng vào ứng dụng của bạn. Ví dụ: nếu cơ sở dữ liệu của bạn chỉ định rằng bạn có một varchar(5)loại, rất có thể bạn có thể tìm thấy một lược đồ tải ORM cho ngôn ngữ cụ thể của bạn ánh xạ loại ngôn ngữ sang loại của lược đồ và lắp ráp ràng buộc về kích thước của chính nó. DBIx for Perl is one such schema loader; đây là một cái khác cho Entity Framework . Khả năng của các trình tải này khác nhau, nhưng bất cứ điều gì chúng có thể cung cấp là một khởi đầu tốt để đảm bảo tính toàn vẹn trong ứng dụng mà không cần đến cơ sở dữ liệu.
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.