Tại sao quy ước nói tên bảng DB phải là số ít nhưng tài nguyên RESTful số nhiều?


27

Đó là một quy ước khá thành lập rằng ít nhất các tên bảng cơ sở dữ liệu, trong SQL, phải là số ít. SELECT * FROM user;Xem câu hỏi và thảo luận này .

Đây cũng là một quy ước khá thành lập rằng các tên tài nguyên API RESTful phải ở dạng số nhiều. GET /users/123POST /usersXem này .

Trong API được hỗ trợ cơ sở dữ liệu đơn giản nhất, tên của tài nguyên trong URL sẽ là bảng và các thành phần dữ liệu trong URL và các cơ quan yêu cầu / phản hồi sẽ ánh xạ trực tiếp đến các cột trong DB. Về mặt khái niệm, tôi không thấy sự khác biệt giữa hoạt động trên dữ liệu thông qua API lý thuyết này so với hoạt động trực tiếp trên dữ liệu thông qua SQL. Và do đó, sự khác biệt trong quy ước đặt tên giữa useruserskhông có ý nghĩa với tôi.

Làm thế nào có thể biện minh cho sự khác biệt về số nhiều khi về mặt khái niệm, API REST và SQL đang làm điều tương tự?


3
Không có quy ước duy nhất trong việc đặt tên bảng DB cũng như đặt tên tài nguyên RESTful mà mọi người tuân theo. Trái lại, có thể có nhiều quy ước. Không có gì đáng ngạc nhiên khi một số có thể đụng độ.
Eric King

13
Không có quy ước thành lập như vậy. Tôi đã luôn luôn sử dụng tên bảng số nhiều. người dùng , tài khoản , v.v., vì họ đang nắm giữ nhiều hơn một thứ.
GrandmasterB

2
.... Mỗi quan hệ là một danh sách. Mô hình quan hệ thực thể miền. Tên thực thể là số ít trong mô hình quan hệ của Codd. Có nhiều tài liệu về nó để nói rằng nó không tồn tại. Nhưng nó là hoàn toàn OK cho bạn để sử dụng tên số nhiều nếu bạn muốn.
Tulains Córdova

4
@ user61852 Có những người có thể sử dụng nó theo quy ước. Nhưng đó không phải là một quy ước công nghiệp được theo dõi rộng rãi như được trình bày trong câu hỏi này theo cách nói, đó là camelCase hoặc MarkDown.
GrandmasterB

4
Cũng nên nhớ rằng REST không phải là giao thức truy cập cơ sở dữ liệu. Không có lý do gì mà các quy ước đặt tên DB (mà bạn từng đi cùng) và các quy ước đặt tên URL (mà bạn từng đi cùng) nên giống nhau, chúng không liên quan gì đến nhau. Hai miền rất khác nhau. Không có ý nghĩa gì để suy ngẫm tại sao cơ sở dữ liệu sử dụng số ít và URL sử dụng số nhiều hơn là để suy nghĩ tại sao cơ sở dữ liệu sử dụng quản trị hệ thống đơn lẻ nhưng tên hệ thống tệp của anh ấy số nhiều. Các khung web được thiết kế kém khiến mọi người nghĩ REST phải làm gì đó với quyền truy cập DB, nhưng thực tế không phải vậy.
Cormac Mulhall

Câu trả lời:


12

Thông số REST (bất kỳ mức nào bạn muốn đi cùng) không được thiết kế dưới dạng truy cập cơ sở dữ liệu. Nó đang cố gắng mang tiêu chuẩn hóa để truy cập API. Các quy ước SQL được đề cập (dù bạn có muốn sử dụng chúng hay không) không được thiết kế với mục đích truy cập API. Chúng là để viết các truy vấn SQL.

Vì vậy, vấn đề cần giải nén ở đây là sự hiểu biết khái niệm rằng một API ánh xạ trực tiếp đến cơ sở dữ liệu. Chúng ta có thể tìm thấy điều này được mô tả như là một mô hình chống ít nhất là từ năm 2009 đến nay .

Lý do chính này là xấu? Mã mô tả "hoạt động này ảnh hưởng đến dữ liệu của tôi như thế nào?" trở thành mã máy khách .

Điều này có một số hiệu ứng khá khủng khiếp trên API. (không phải là một danh sách đầy đủ)

Nó làm cho việc tích hợp với API trở nên khó khăn

Tôi tưởng tượng các bước để tạo một người dùng mới được ghi lại như sau:

  1. POST /users { .. }
  2. POST /usersettings { .. } với một số giá trị mặc định
  3. POST /confirmemails { .. }

Nhưng làm thế nào để bạn xử lý một thất bại của bước # 2? Đã bao nhiêu lần việc xử lý sao chép logic tương tự này cho các khách hàng khác của API của bạn?

Các hoạt động dữ liệu này thường dễ dàng hơn để sắp xếp theo phía máy chủ, trong khi được bắt đầu từ máy khách dưới dạng một hoạt động. Ví dụ POST /newusersetup. Các DBA có thể nhận ra đây là một thủ tục được lưu trữ, nhưng hoạt động API có thể có các hiệu ứng vượt ra ngoài cơ sở dữ liệu.

Bảo mật API trở thành một lỗ đen tuyệt vọng

Giả sử bạn cần hợp nhất hai tài khoản người dùng.

  1. GET /users/1
  2. PUT /users/2 { .. }
  3. DELETE /users/1

Làm thế nào bạn sẽ thiết lập quyền người dùng để cho phép tính năng hợp nhất trong khi không cho phép xóa người dùng? Là xóa một người dùng thậm chí khá đại diện bởi DELETE /users/1khi nào /usersettingscũng tồn tại?

Các hoạt động API nên được xem là các hoạt động cấp cao hơn (cơ sở dữ liệu) có thể gây ra nhiều thay đổi trong hệ thống.

Bảo trì trở nên khó khăn hơn

... bởi vì khách hàng của bạn phụ thuộc vào cấu trúc cơ sở dữ liệu của bạn.

Dựa trên kinh nghiệm của tôi với kịch bản này:

  • Bạn không thể đổi tên hoặc xóa bảng / cột hiện có. Ngay cả khi chúng được đặt tên không chính xác cho chức năng của chúng hoặc không còn được sử dụng. Khách hàng sẽ phá vỡ.
  • Các tính năng mới không thể thay đổi cấu trúc dữ liệu hiện có, vì vậy dữ liệu và chức năng của nó thường được tách biệt một cách giả tạo ngay cả khi nó hoàn toàn thuộc về một tính năng hiện có.
  • Cơ sở mã dần dần trở nên khó hiểu hơn do sự phân mảnh, tên khó hiểu và hành lý còn sót lại không thể được gỡ bỏ một cách an toàn.
  • Tất cả trừ những thay đổi tầm thường ngày càng trở nên rủi ro và tốn thời gian.
  • Hệ thống đình trệ và cuối cùng được thay thế.

Đừng để lộ cấu trúc cơ sở dữ liệu của bạn trực tiếp cho khách hàng ... đặc biệt là các khách hàng mà bạn không có quyền kiểm soát phát triển. Sử dụng API để thu hẹp ứng dụng khách xuống chỉ hoạt động hợp lệ.

Vì vậy, nếu bạn đang sử dụng API như một giao diện đi thẳng vào cơ sở dữ liệu, thì số nhiều là điều bạn lo lắng nhất. Đối với các thử nghiệm khác, tôi khuyên bạn nên dành thời gian để xác định các hoạt động cấp cao hơn mà API sẽ thể hiện. Và khi bạn nhìn theo cách đó, không có xung đột giữa tên thực thể API số nhiều và tên thực thể SQL số ​​ít. Họ ở đó vì những lý do khác nhau.


1
Trả lời một câu hỏi khác nhau. OP không ngụ ý liên kết trực tiếp các thực thể API và DB, chỉ có sự hiện diện của một số thực thể trong cả hai bối cảnh.
Basilevs

2
Vui lòng gửi câu trả lời cho câu hỏi mà bạn nghĩ đang được hỏi.
Kasey speakman

4
@Basilevs Thật ra tôi nghĩ điều này không trả lời được câu hỏi. Đôi khi câu trả lời có thể xuất hiện gián tiếp khi một câu hỏi được đóng khung xung quanh các giả định không chính xác. Các "sự hiện diện của một số đơn vị trong cả hai tình huống" có nghĩa họ là những thực thể tương tự, trong đó hàm ý một 1-1 tương ứng giữa số và không phải người khác. Sự tương ứng của một API trên một mô hình dữ liệu phức tạp ngụ ý một thiết kế thiếu sót.
Aluan Haddad

Trong số này có nhiều lý do tôi đã ngừng sử dụng Spring Data Rest.
Sebastiaan van den Broek

4

API REST và SQL KHÔNG "làm điều tương tự"

OP yêu cầu:

Làm thế nào có thể biện minh cho sự khác biệt về số nhiều khi về mặt khái niệm, API REST và SQL đang làm điều tương tự?

À, nhưng châu chấu, có vẻ như giao diện RESTful và các bảng SQL "đang làm điều tương tự", nhưng vệ sinh lập trình tốt cho chúng ta biết rằng luôn có một lớp trung gian làm trung gian giữa API REST và cơ sở dữ liệu. Bỏ qua điểm này là đi lạc từ con đường đến giác ngộ phần mềm! :)

Vì vậy, các API RESTful và các bảng SQL có thể vui vẻ tuân theo các quy ước đặt tên thành ngữ của riêng chúng, được ghi chép lại và thảo luận kỹ lưỡng ở nơi khác.

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.