RESTful API를위한 SQL 데이터베이스 구조


11

RESTful API를 작성 중입니다. 리소스를 중심으로 데이터베이스 테이블을 디자인하는 가장 좋은 방법을 결정하기 위해 고심하고 있습니다.

처음에는 리소스 당 테이블을 사용하는 것이 좋지만 이제는 리소스 체인 아래로 테이블이 기하 급수적으로 커질 까 걱정됩니다.

예를 들어 사용자, 고객, 영업이라는 세 가지 리소스가 있다고 가정합니다. 사용자는 내 API의 가입자이고 클라이언트는 사용자 고객이며 판매는 각 클라이언트가 사용자 계정으로 구매 한 것입니다.

판매 리소스는 다음과 같이 액세스됩니다

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

따라서 10 명의 사용자가 있고 각각 10 명의 고객이 있고 각 고객에 대해 10 명의 판매가있는 경우, 우리가가는 리소스 체인의 크기가 멀수록 테이블 크기가 커집니다.

SQL이 큰 테이블에 대처할 수 있다고 확신하지만 읽기 및 쓰기로 인해 속도가 느려질 지 확실하지 않습니다. 위의 예는 그것을 설명하지 못할 수도 있지만, 제 API는 점진적으로 더 많은 쓰기와 읽기를 할 것이며 우리가가는 리소스 체인을 더 많이 읽을 것입니다. 따라서 데이터베이스에서 가장 큰 테이블을 작은 테이블보다 여러 번 읽고 쓰는 시나리오가 있습니다.

쿼리를 실행하기 전에 테이블을 조인해야합니다. 그 이유는 각 사용자가 같은 이름의 클라이언트를 가질 수 있기 때문입니다. 잘못된 클라이언트 데이터를 얻지 않기 위해 users 테이블과 clients 테이블은 {userID}로 조인됩니다. 이것은 또한 판매의 경우입니다. 큰 테이블을 결합하고 읽기 및 쓰기를 실행하면 속도가 느려질까요?

답변:


31

리소스를 중심으로 데이터베이스 테이블을 디자인하는 가장 좋은 방법을 결정하기 위해 고심하고 있습니다.

하지마

RESTful 원칙 에 따라 API를 설계하고 정규화 원칙 에 따라 데이터베이스를 설계하십시오 . 하나는 다른 것에 영향을 줄 필요가 없습니다.

데이터베이스는 SaleResource테이블을 포함하지 않아야하고, 테이블은 Sale(또는 구매 / 주문) 테이블을 포함해야합니다 . 이 테이블에는 관련 사용자 및 고객 테이블에 대한 판매 및 외래 키를 고유하게 식별하는 기본 키가 포함됩니다.

REST api는 식별 한 자원에 대한 요청을 GET /users/{userID}/clients/{clientID}/sales/{salesID}해당 데이터베이스 쿼리로 변환하고, 행을 검색하며, 판매를 나타내는 자원을 구성하고이를 클라이언트로 리턴합니다.

현재 내부 데이터베이스 식별자 (UserID / ClientId / SalesID)로 보이는 것을 외부에 공개하고 있습니다. 귀하의 경우에는 적절할 수 있지만 일반적으로 <entity>IDRESTful API에서 느낍니다.


감사. 따라서 기본적으로 말하는 것은 데이터베이스를 정규화하고 적절한 인덱싱 등을 설정하는 한 달성하고자하는 성능 문제가 없어야한다는 것입니다.
Gaz_Edge

3
예. 언급 한 것은 표준화 된 스키마에서 벗어날 필요가 없습니다.
Mark Storey-Smith

9

관계형 데이터베이스 (따라서 SQL)는 거대한 테이블에서 하나 또는 몇 개의 행을 찾는 데 정말 좋습니다. 이것이 색인의 대상입니다. 또한 조인 처리에 매우 뛰어납니다. 당신은 실제로 질문이 없습니다 . 줄 사이에서 기본적으로 다중 테넌트 데이터베이스 디자인을 수행하는 방법을 묻습니다. 추가 질문을하기 전에 다중 테넌트 데이터 아키텍처 를 읽어보십시오 . 패턴 (개별 데이터베이스, 공유 데이터베이스 별도 스키마, 공유 데이터베이스 공유 스키마) 중 하나를 선택한 다음 세부 사항에 대해 논의합니다. 지금은 마지막 패턴 만 구상했지만 장단점은 고려하지 않았습니다. 읽어봐

참고로 user/{userID}URI에 필요하지 않습니다 . 인증 정보에서 테넌트 (userID)를 알고 있습니다.


고마워-그래 더 읽어야 해 현재까지 내 프로젝트는 데이터베이스 작업이 거의 없었습니다. 추천 리소스를 읽으십시오
Gaz_Edge

나는 공유 공유가 나를 위해 갈 길이라고 생각합니다. 내 '사용자'는 '임차인'이 아닙니다. 분리 된 데이터가 필요하지 않으며 데이터베이스 관리 기능에 직접 액세스 할 필요가 없습니다. 내가 읽은 것에서 공유 공유가 가장 좋습니다. 어떻게 생각해?
Gaz_Edge

2
공유가 가장 쉽습니다. 당신은 추가해야합니다 user_id모든 테이블에 대한 키로하고 추가 left.user_id = right.user_id관련이 (모두 보통) 조인에. 일부으로 ORMs는 지원 scopping 접근을. 그리고 'foo'사용자가 사용자 'bar'의 판매를 보거나 수정하기를 원하지 않기 때문에 사용자 테넌트입니다.
Remus Rusanu

감사. 데이터베이스 구조를 만드는 데 인덱스가 중요하다는 것을 알기 시작했습니다.
Gaz_Edge

0

여기에 이미 언급 된 내용에 추가하기 위해 실제 API와 데이터베이스 계층 사이에 인터페이스를 구축 할 수 있습니다. 캐싱 및 요약 테이블을 쉽게 추가 할 수 있습니다.


1
일부 링크 또는 추가 설명이 도움이 될 것입니다
Gaz_Edge

죄송합니다, 아직 댓글을 달 수 없습니다 ..
Matt Koskela
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.