ID phụ trợ có nên công khai hay không trên API REST?


13

Dựa trên những gì anh chàng này nói: http://toddfredrich.com/ids-in-rest-api.html

Giả sử anh ta đúng về việc sử dụng UUID để xác định tài nguyên api. Sau đó, tôi gặp rắc rối khi cố gắng thực hiện theo cách đó, đây là:

class FooEntity {

    final String id = null;  //auto-generated by my backend (mongodb), not shared
    final UUID uid = UUID.randomUUID();  //the resource id
}

(Giữa máy khách và máy chủ, được gửi và nhận DTO, không phải các thực thể cơ sở dữ liệu.)

Vấn đề bây giờ là nó idkhông hữu ích vì tôi không sử dụng nó nữa. Khách hàng thực hiện các yêu cầu, uidvậy tại sao tôi lại phải xử lý 2 id? Sau đó, chúng tôi trở lại cùng một vấn đề của sự khởi đầu. Nếu tôi đặt UUID làm khóa chính ( _id) thì tôi sẽ hiển thị id phụ trợ cho công chúng.

Bên cạnh đó là chủ đề hiệu quả. Tôi đã đọc rằng lập chỉ mục bởi ObjectId hiệu quả hơn nhiều so với UUID.

Câu trả lời:


7

Tôi đang phơi bày id phụ trợ cho công chúng

Bạn có phương tiện nào khác để xác định thực thể của mình khi chúng được trả lại thông qua yêu cầu? Điều đó hoàn toàn hợp pháp và an toàn hơn SSN hoặc các định danh tương tự. Đó là những gì Todd đang nói về - làm cho công nghệ nhận dạng và thực thể trở thành trung lập và anh ấy đúng.

Chủ đề hiệu quả

Bạn có thể giữ cả hai định danh nếu ObjectId thực sự hiệu quả hơn nhiều. Về mặt lý thuyết, việc sử dụng UUID cho mã định danh luôn tốt hơn so với tăng tự động cơ sở dữ liệu.


Bạn đúng về việc phơi bày id. Về hiệu quả, tôi vẫn không thấy làm thế nào tôi có thể sử dụng cả hai id. Nếu khách hàng đưa ra yêu cầu với uuid, thì tôi sẽ thực hiện truy vấn tìm kiếm trên trường uuid và nhận kết quả. Tôi không thể biết objectid cho đến khi tôi lấy thực thể. Vì vậy, tôi đoán không có điểm nào về việc sử dụng cả hai.
anat0lius

1
Nó có thể có ý nghĩa cho hỗ trợ di sản. Hãy nói rằng id tự động cũ vẫn được tham chiếu bởi dữ liệu cũ hoặc / và hệ thống. Mặt khác, hoàn toàn có thể hoạt động chỉ với UUID
Laiv

1
Trả lời câu hỏi của bạn " Bạn có phương tiện nào khác để xác định thực thể của mình khi chúng được trả lại thông qua yêu cầu? ", ID proxy mỗi phiên. " Cách bảo vệ tốt nhất là tránh để lộ các tham chiếu đối tượng trực tiếp đến người dùng bằng cách sử dụng một chỉ mục, bản đồ tham chiếu gián tiếp hoặc phương pháp gián tiếp khác để xác thực dễ dàng "
Peter Taylor

5

Không, theo như cơ sở dữ liệu, không có gì về cấu trúc bên trong được hiển thị với API bên ngoài. ID không có trí thông minh. Chúng thậm chí không phải là duy nhất trong thế giới thực. ID: 47 ở khắp mọi nơi. Có những thực thể bạn có quyền truy cập và có thể có thể thao túng dữ liệu, nhưng liệu cơ sở dữ liệu này có lưu trữ mọi thứ trong một hoặc mười bảng hay không, sử dụng ID gia tăng dưới dạng PK và liên quan đến FK, bạn sẽ không bao giờ biết.

Nếu bạn có thể GetUserAccountByID (12345) chỉ cần yêu cầu ai đó dùng thử GetUserAccountByID (12346). Mặc dù nó sẽ không hoạt động do các biện pháp bảo mật khác, thậm chí không thử và không cố gắng hack mạng xã hội bằng cách hỏi thông tin trên Tài khoản: 12346. Trừ khi bạn gọi cho DBA và sẵn sàng chờ 2 tuần để phản hồi;)

Vì vậy, hãy tạo GUID theo cách bạn thấy phù hợp hoặc bất kỳ khóa tự nhiên nào khác như số điện thoại hoặc địa chỉ email. Đặt một ràng buộc duy nhất trên trường trong bảng để tránh một số lần sao chép và dán cố định trong một số lần thử dữ liệu hợp nhất.

Điều này không dư thừa. Hai lĩnh vực phục vụ các mục đích khác nhau.


0

Về id hiệu quả so với UUID, trừ khi bạn có nhiều lần tham gia liên quan đến nhiều bảng, mỗi bảng có hàng triệu bản ghi, điều này sẽ không có nhiều khác biệt. Sử dụng UUID làm cho ứng dụng của bạn khó xử lý hơn nhiều nếu bạn không kiểm tra / áp dụng ngay bên phía máy chủ.:

  • NHẬN ĐƯỢC 1
  • NHẬN [...] / 2

Thật dễ dàng khi sử dụng ID, nếu bạn sử dụng UUID thay vào đó, đó là một tùy chọn ít hơn cho một trình cạo.

ID có thể được xem như là một cái gì đó bên trong đối với cơ sở dữ liệu của ứng dụng của bạn. Có ba từ quan trọng trong câu đó:

  • Ứng dụng: vì đó là mô hình của bạn nên có khả năng các bảng của bạn chỉ được sử dụng bởi ứng dụng đó
  • Cơ sở dữ liệu: Nếu nhiều ứng dụng sử dụng nó trên cùng một cơ sở dữ liệu, bạn sẽ ổn thôi
  • Sơ thẩm (của cơ sở dữ liệu): nếu bạn có một hệ thống phân tán, id sẽ xung đột với nhau và chúng sẽ vô nghĩa đối với bất kỳ hệ thống / ứng dụng nào khác không sử dụng cá thể cơ sở dữ liệu của bạn. UUID là giải pháp cho trường hợp cụ thể đó.

Theo sở thích cá nhân: Tôi thích có ID đơn giản và ID doanh nghiệp duy nhất (thư, đăng nhập, ...). Vì vậy, nếu tôi phải trao đổi dữ liệu, tôi sẽ sử dụng ID doanh nghiệp, vì hệ thống đích có thể không xử lý UUID, nhưng anh ta rất có thể (không bao giờ nói không bao giờ ...) xử lý tốt một khóa doanh nghiệp duy nhất.

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.