[궁금했던 내용들]
1. ObjectId란 무엇인가?
MongoDB에서 ObjectId는 각 문서를 고유하게 식별하기 위해 사용되는 데이터 타입입니다.
모든 문서는 _id 필드를 가지고 있으며, 기본적으로 이 필드에는 ObjectId가 할당됩니다.
ObjectId는 12바이트 크기의 고유한 식별자로 다음과 같은 정보를 포함합니다
- 4바이트: 유닉스 타임스탬프 (문서가 생성된 시간)
- 5바이트: 머신 ID (서버를 식별)
- 3바이트: 프로세스 ID (MongoDB 프로세스를 식별)
- 3바이트: 자동 증가하는 카운터 (같은 초에 생성된 ObjectId를 구별)
이러한 구조를 통해 ObjectId는 전 세계에서 고유성을 유지하며, 시간 정보도 포함하고 있어 언제 생성되었는지 확인할 수 있습니다.
2. 왜 ObjectId를 사용하는가?
ObjectId는 분산된 환경에서도 고유성을 보장하기 위해 사용됩니다.
여러 서버에서 동시에 문서를 생성할 때도 충돌 없이 고유한 식별자를 생성할 수 있습니다.
또한, ObjectId는 인덱싱되어 있어 MongoDB의 검색 성능을 최적화할 수 있습니다.
예를 들어, 고객 테이블에서 각 고객을 고유하게 식별하기 위해 ObjectId를 사용하면, 주문 테이블에서 customer_id 필드를 통해 고객을 참조할 때 동일한 ObjectId를 사용하여 관계를 유지할 수 있습니다.
3. ObjectId와 다른 데이터 타입의 관계
만약 customer 테이블의 _id가 int 형식이라면, 이를 참조하는 필드(customer_id 등)도 int 형식이어야 합니다.
MongoDB는 타입에 민감하기 때문에, 참조하는 필드의 데이터 타입은 반드시 참조 대상 필드와 일치해야 합니다.
따라서, customer의 _id가 ObjectId 형식인 경우, 이를 참조하는 모든 필드(customer_id 등)도 ObjectId 형식으로 설정해야 합니다.
4. double 대신 decimal 또는 int?
주문 테이블에서 총 금액(total_amount) 필드가 double 형식으로 설정된 이유는 소수점 이하의 정밀한 금액 값을 저장하기 위함입니다.
그러나 실제로는 decimal 데이터 타입이 금전적인 값을 다룰 때 더 적합합니다.
decimal은 고정 소수점 연산을 지원하여 정밀도를 보장합니다.
반면, double은 부동 소수점 연산을 사용하므로, 큰 숫자를 처리할 때 약간의 오차가 발생할 수 있습니다.
따라서 금전적인 데이터를 처리할 때는 decimal을 사용하는 것이 좋습니다.
5. auto는 어디에 사용되는가?
auto는 시스템이 자동으로 값을 생성하거나 갱신하는 필드를 나타냅니다.
예를 들어, created_datetime와 updated_datetime 필드는 문서가 처음 생성되거나 수정될 때 시스템이 자동으로 해당 값을 설정합니다.
6. MongoDB에서 참조(Reference)와 내장(Embedded) 방식
관계형 데이터베이스에서는 테이블 간의 관계를 설정하기 위해 외래 키를 사용합니다.
반면, MongoDB와 같은 NoSQL 데이터베이스에서는 일반적으로 두 가지 방식으로 관계를 표현합니다
- 참조(Reference) 방식: 한 컬렉션의 필드가 다른 컬렉션의 문서 ID를 참조하는 방식입니다. 예를 들어, Order 컬렉션의 customer_id 필드가 Customer 컬렉션의 _id를 참조하는 경우입니다. 이를 통해 두 컬렉션 간의 관계를 유지할 수 있습니다.
- 내장(Embedded) 방식: 한 컬렉션의 문서에 다른 컬렉션의 문서를 직접 포함하는 방식입니다. 예를 들어, Order 문서에 Customer 정보를 내장할 수 있습니다. 이는 데이터를 한 번에 가져올 수 있어 읽기 성능을 최적화하지만, 중복 데이터가 많아질 수 있다는 단점이 있습니다.
7. Optional 필드와 Null 값
Optional로 설정된 필드는 Null 값을 허용합니다.
이는 해당 필드가 필수가 아니며, 값이 제공되지 않을 수 있음을 의미합니다.
8. 테이블 및 컬럼 ID와 대문자 사용
데이터베이스 설계에서는 가독성과 일관성을 유지하기 위해 테이블 ID와 컬럼 ID를 대문자로 작성하는 것이 일반적입니다.
'Development > NoSQL' 카테고리의 다른 글
요구사항 정의서 작성과 DB 설계 과정 (2) | 2024.09.09 |
---|---|
BPMN을 활용한 고객 관리 프로세스 다이어그램 설계 (1) | 2024.09.09 |
요구사항 정의서 작성 (1) | 2024.09.04 |
MongoDB CRUD와 문법 (1) | 2024.08.27 |
MongoDB 기본 명령어와 비교,논리 연산자 (0) | 2024.08.26 |