이 질문은 데이터베이스를 어떻게 디자인 해야하는지에 관한 것입니다. 더 나은 솔루션이 무엇인지에 따라 관계형 / nosql 데이터베이스가 될 수 있습니다
"회사"및 "사용자"를 추적하기 위해 데이터베이스를 포함하는 시스템을 작성해야하는 요구 사항이 있습니다. 단일 사용자는 항상 한 회사에만 속합니다
- 사용자는 한 회사에만 속할 수 있습니다
- 회사는 많은 사용자를 가질 수 있습니다
"회사"테이블의 디자인은 매우 간단합니다. 회사는 다음과 같은 속성 / 열을 갖습니다. (간단하게 유지합시다)
ID, COMPANY_NAME, CREATED_ON
첫 번째 시나리오
간단하고 간단하게 사용자는 모두 동일한 속성을 가지므로 관계형 스타일의 사용자 테이블로 쉽게 수행 할 수 있습니다.
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
두 번째 시나리오
다른 회사가 사용자에 대해 다른 프로필 속성을 저장하려는 경우 어떻게됩니까? 각 회사에는 해당 회사의 모든 사용자에게 적용되는 정의 된 속성 세트가 있습니다.
예를 들면 다음과 같습니다.
- 회사 A가 저장하려고 함 : LIKE_MOVIE (부울), LIKE_MUSIC (부울)
- 회사 B가 다음을 저장하려고합니다. FAV_CUISINE (문자열)
- 회사 C는 다음을 저장하려고합니다. OWN_DOG (부울), DOG_COUNT (int)
접근법 1
무차별 대입 방법은 사용자에 대한 단일 스키마를 보유하고 회사에 속하지 않는 경우 널을 갖도록하는 것입니다.
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
이는 많은 NULLS 및 열과 관련이없는 열이있는 사용자 행으로 끝날 것이기 때문에 다소 불쾌합니다 (예 : 회사 A에 속한 모든 사용자는 FAV_CUISINE, OWN_DOG, DOG_COUNT에 대해 NULL 값을 가짐)
접근법 2
두 번째 방법은 "자유 양식 필드"를 사용하는 것입니다.
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
사용자 정의 필드가 무엇인지 모르기 때문에 자체적으로 불쾌 할 수 있습니다. 데이터 유형은 저장된 값을 반영하지 않습니다 (예 : int 값을 VARCHAR로 저장합니다).
접근법 3
PostgreSQL JSON 필드를 살펴 보았습니다.이 경우 다음을 갖게됩니다.
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
이 경우 어떻게 다른 스키마를 사용자에게 적용 할 수 있습니까? 회사 A의 사용자에게는 다음과 같은 스키마가 있습니다.
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
회사 C의 사용자는 다른 스키마를 가지지 만
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
이 문제를 어떻게 해결해야합니까? 관계 (회사)를 기반으로 단일 "개체"(사용자)에 대해이 유연한 스키마를 허용하도록 데이터베이스를 올바르게 설계하려면 어떻게해야합니까?
관계형 솔루션? nosql 솔루션?
편집 : 또한 사용자 속성을 열이 아닌 행에 저장하는 "CUSTOM_PROFILE"테이블에 대해서도 생각했습니다.
이 방법에는 두 가지 문제가 있습니다.
1) 사용자 당 데이터 가 열이 아닌 행으로 증가합니다. 즉 , 사용자에 대한 전체 그림을 얻으려면 많은 조인을 수행해야하며 서로 다른 사용자 지정 특성의 "사용자 지정 프로필"테이블에 여러 번 조인해야합니다.
2) 데이터 값이 정수 또는 부울 등으로 알고 있음에도 불구하고 데이터 값은 항상 VARCHAR로 저장되어 일반적입니다.