예를 들어, 사용자와 모든 전화 번호 및 이메일 주소를 가져오고 싶다고 가정하십시오. 전화 번호와 이메일은 별도의 테이블에 저장되며 한 명의 사용자는 많은 전화 / 이메일에 접속합니다. 나는 이것을 아주 쉽게 할 수있다.
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
이 문제는 사용자 이름, DOB, 선호하는 색상 및 사용자 테이블에 저장된 다른 모든 정보를 각 레코드 ( 이메일 전화 레코드) 에 대해 반복해서 반환하므로 대역폭을 소모하고 속도가 느려질 수 있습니다 결과를 낮추십시오.
각 사용자에 대해 단일 행을 반환하면 레코드 목록 에 전자 메일 목록 과 전화 목록 이 있으면 더 좋지 않습니까? 데이터 작업도 훨씬 쉬워집니다.
LINQ 또는 다른 프레임 워크를 사용하여 이와 같은 결과를 얻을 수 있다는 것을 알고 있지만 관계형 데이터베이스의 기본 디자인에는 약한 것 같습니다.
우리는 NoSQL을 사용하여이 문제를 해결할 수 있지만 중간 정도의 근거는 없어야합니까?
뭔가 빠졌습니까? 왜 존재하지 않습니까?
* 예, 이런 식으로 설계되었습니다. 알겠습니다 작업하기 쉬운 대안이없는 이유가 궁금합니다. SQL은 작업을 계속 수행 할 수 있지만 직교 곱 대신 중첩 형식으로 데이터를 반환하는 약간의 사후 처리를 수행하기 위해 키워드를 추가 할 수 있습니다.
나는 이것이 선택한 스크립팅 언어로 수행 될 수 있다는 것을 알고 있지만 SQL 서버는 중복 데이터 (아래 예)를 보내거나와 같은 여러 쿼리를 발행해야합니다 SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
MySQL이 이와 비슷한 것을 반환하는 대신 :
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "johnsmith45@gmail.com",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "john@smithsunite.com",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "originaljane@deerclan.com",
}
]
그런 다음 클라이언트 측에서 고유 한 식별자를 그룹화해야하므로 클라이언트 측에서 원하는 방식으로 결과 세트를 다시 포맷하기 위해 클라이언트 측을 가져와야합니다.
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["originaljane@deerclan.com"],
}
]
또는 사용자 3 명, 이메일 1 명, 전화 번호 1 명으로 3 가지 쿼리를 실행할 수 있지만 이메일 및 전화 번호 결과 세트에는 user_id가 포함되어 있어야 사용자와 다시 일치시킬 수 있습니다. 이전에 가져 왔습니다. 다시, 중복 데이터 및 불필요한 후 처리.