Cấu trúc cơ sở dữ liệu SQL cho API RESTful


11

Tôi đang tạo API RESTful. Tôi đang đấu tranh để quyết định cách tốt nhất để thiết kế các bảng cơ sở dữ liệu của mình xung quanh các tài nguyên của tôi.

Ban đầu, tôi mặc dù một bảng cho mỗi tài nguyên sẽ là một cách tốt để đi, nhưng bây giờ tôi lo lắng rằng điều này sẽ dẫn đến các bảng lớn hơn theo cấp số nhân khi tiếp tục đi xuống chuỗi tài nguyên mà bạn đi.

Ví dụ, hãy tưởng tượng tôi có ba tài nguyên - người dùng, khách hàng, bán hàng. Người dùng là người đăng ký với api của tôi, khách hàng là khách hàng của người dùng và bán hàng là các giao dịch mua của mỗi khách hàng đối với tài khoản người dùng.

Một tài nguyên bán hàng được truy cập như sau

GET /users/{userID}/clients/{clientID}/sales/{salesID}

Vì vậy, nếu có 10 người dùng, mỗi người có 10 khách hàng và với mỗi khách hàng có 10 doanh số, kích thước bảng sẽ càng lớn hơn trong chuỗi tài nguyên mà chúng tôi đi.

Tôi khá tự tin rằng SQL có thể đối phó với các bảng lớn, nhưng tôi không chắc cách đọc và viết sẽ làm mọi thứ chậm lại. Ví dụ trên có thể không minh họa điều đó, nhưng api của tôi sẽ ngày càng viết nhiều hơn và đọc tiếp theo chuỗi tài nguyên mà chúng ta đi. Do đó, tôi có kịch bản trong đó các bảng lớn nhất trong cơ sở dữ liệu của tôi, sẽ được đọc và ghi nhiều lần hơn các bảng nhỏ hơn.

Cũng cần phải tham gia các bảng trước khi chạy truy vấn. Lý do là tôi cho phép mỗi người dùng có một khách hàng có cùng tên. Để tránh nhận dữ liệu khách hàng sai, bảng người dùng và bảng khách hàng được nối bởi {userID}. Đây cũng là trường hợp để bán hàng. Sẽ tham gia các bảng lớn và chạy đọc và viết những thứ chậm hơn nữa?

Câu trả lời:


31

Tôi đang đấu tranh để quyết định cách tốt nhất để thiết kế các bảng cơ sở dữ liệu của mình xung quanh các tài nguyên của tôi.

Đừng.

Thiết kế API của bạn theo công thức RESTful , thiết kế cơ sở dữ liệu của bạn theo nguyên tắc chuẩn hóa . Người này không cần tác động đến người kia.

Cơ sở dữ liệu của bạn không nên chứa một SaleResourcebảng, nó nên chứa mộtSale (hoặc mua / đặt hàng). Bảng đó sẽ bao gồm một khóa chính xác định duy nhất một khóa Bán và khóa ngoại cho các bảng Người dùng và Khách hàng có liên quan.

Bạn REST api sẽ dịch một yêu cầu cho tài nguyên được xác định bởi GET /users/{userID}/clients/{clientID}/sales/{salesID} truy vấn cơ sở dữ liệu thích hợp, truy xuất hàng, xây dựng tài nguyên đại diện cho Bán hàng và trả lại cho khách hàng.

Hãy chú ý rằng bạn hiện đang hiển thị những gì có vẻ là định danh cơ sở dữ liệu nội bộ (UserID / ClientId / SalesID) với thế giới bên ngoài. Nó có thể phù hợp trong trường hợp của bạn nhưng thường <entity>IDcảm thấy khó chịu trong API RESTful.


cảm ơn. Vì vậy, những gì bạn đang về cơ bản nói là chừng nào tôi bình thường hóa cơ sở dữ liệu và thiết lập thích hợp của tôi lập chỉ mục vv, không nên có vấn đề hiệu suất cho những gì tôi muốn đạt được
Gaz_Edge

3
Đúng. Không có gì bạn đề cập cho thấy đi chệch khỏi một lược đồ chuẩn hóa là cần thiết.
Mark Storey-Smith

9

Cơ sở dữ liệu quan hệ (do đó SQL) thực sự tốt trong việc định vị một (hoặc vài) hàng từ bảng lớn. Đây là những gì chỉ số dành cho. Họ cũng khá tuyệt vời khi xử lý tham gia. Bạn không thực sự có một câu hỏi . Giữa các dòng, về cơ bản, bạn đang hỏi về cách thực hiện thiết kế cơ sở dữ liệu nhiều người thuê. Tôi đề nghị bạn đọc Kiến trúc dữ liệu nhiều người thuê trước khi đặt câu hỏi thêm. Chọn một trong các mẫu (cơ sở dữ liệu riêng, lược đồ riêng cho cơ sở dữ liệu dùng chung, lược đồ dùng chung cơ sở dữ liệu dùng chung) và sau đó chúng tôi sẽ thảo luận về chi tiết cụ thể. Ngay bây giờ bạn chỉ hình dung mẫu cuối cùng, nhưng không xem xét ưu và nhược điểm. Đọc lên.

Như một lưu ý phụ: bạn không cần user/{userID}trong URI. Bạn biết người thuê nhà (userID) từ thông tin xác thực.


cảm ơn- Vâng tôi cần phải đọc thêm. Các dự án của tôi cho đến nay đã có rất ít cơ sở dữ liệu làm việc. Tôi sẽ đọc tài nguyên mà bạn đề xuất
Gaz_Edge

Tôi nghĩ chia sẻ chia sẻ là cách để đi cho tôi. 'Người dùng' của tôi không phải là 'người thuê nhà'. Họ không yêu cầu dữ liệu biệt lập và sẽ không bao giờ cần truy cập trực tiếp vào bất kỳ chức năng quản lý cơ sở dữ liệu nào. Từ những gì tôi đọc, điều này sẽ gợi ý chia sẻ chia sẻ là tốt nhất? Bạn nghĩ sao?
Gaz_Edge

2
chia sẻ là dễ nhất. Bạn phải thêm user_idkhóa làm khóa cho mỗi bảng và thêm left.user_id = right.user_idvào các phép nối có liên quan (thông thường, tất cả). Một số ORM hỗ trợ truy cập. Và đừng để bị lừa, người dùng của bạn người thuê nhà, vì bạn không muốn người dùng 'foo' nhìn thấy / sửa đổi doanh số của 'thanh' người dùng.
Remus Rusanu

Cảm ơn. Tôi bắt đầu thấy rằng các chỉ mục là chìa khóa để tạo cấu trúc cơ sở dữ liệu của tôi.
Gaz_Edge

0

Chỉ cần thêm vào những gì đã được nói ở đây - bạn có thể muốn xây dựng giao diện giữa API thực tế và lớp cơ sở dữ liệu của bạn. Nó làm cho việc thêm bộ đệm và bảng tóm tắt dễ dàng hơn xuống dòng ...


1
một số liên kết hoặc giải thích thêm sẽ hữu ích
Gaz_Edge

Xin lỗi, chưa thể bình luận nào ..
Matt Koskela
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.