2010-05-11 2 views
2

내 프로젝트의 데이터 모델 디자인을 마무리하려고하는데, 어떤 방법으로이 프로젝트를 진행할 지 알아 내려고합니다.일대일 관계를위한 데이터베이스 디자인

나는 사용자 테이블과 해당 사용자에게 적용되는 속성의 개수가 다양합니다. 속성은 거의 모든 경우에 선택적이므로 null 값이 허용됩니다. 이러한 각 속성은 사용자에게 일대일로 적용됩니다. 나는 그것들을 같은 테이블에 놓아야하고, 속성이 추가 될 때 (사용자 테이블을 꽤 넓게 만들 때) 열을 계속 추가해야하며, 아니면 각 속성을 외래 키가있는 별도의 테이블에 사용자 테이블에 놓아야합니까?

나는 EAV 모델을 사용하지 않기로 결정했습니다.

감사합니다.

편집

속성 등 모든 선택 사항 결혼 여부, 성별, 나이, 이름과 성, 직업, 같은 일을 포함한다.

+0

EAV의 문제점은 무엇입니까? 일반적으로 표준화되어 있으며 그 이상으로 비용이 많이 들지 않습니다. 일부 추가 조인 – ahsteele

+0

EAV에 대해 왜 결정하셨습니까? – Leslie

+1

EAV는 퍼포먼스 킬러이기 때문에 EAV – HLGEM

답변

2

사용자 테이블에 어떤 속성을 추가 할 것인지 몇 가지 예를 들려 줄 수 있습니까? 약 50 개 이하의 열에 머무르는 한 큰 문제가 아닙니다.

, 하나의 방법은 데이터를 분할하는 것입니다 방법 적 : 사용자 이름, hashed_password, LAST_LOGIN, last_ip, current_ip 등, 다른 테이블 DISPLAY_NAME에 대한 (프로파일), birth_day 등

하나의 테이블 (사용자)

동일한 id 속성을 통해 연결하거나 다른 테이블에 user_id 열을 추가 할 수 있습니다.

2

에 따라 다릅니다.

사용자는 몇 퍼센트의 사용자가 해당 속성을 가질지 살펴 봐야합니다. 속성이 'WalkedOnTheMoon'이고 'Sex'인 경우 사용자의 테이블에 포함 시키십시오. 또한 기본 테이블의 열 수를 고려해 볼 때 10-20 몇 가지가 그렇게 큰 상처를주지는 않습니다.

관련 속성이 여러 개인 경우 'MedicalSchoolId', 'MedicalSpeciality', 'ResidencyHospitalId'등과 같은 공통 속성을 UserMedical 표에 결합 할 수 있습니다.

+0

나이를 저장하지 않고 생년월일을 저장하십시오. –

3

테이블 :

  • USERS
  • USER_PREFERENCE_TYPE_CODES
  • USER_PREFERENCES

USER_PREFERENCESUSERSUSER_PREFERENCE_TYPE_CODES 테이블 연결 대다 테이블이다. 이렇게하면 기본 설정 유형 속성을 정규화 할 수 있으며 ALTER TABLE 문이 필요없는 환경 설정을 유연하게 적용 할 수 있습니다.

+0

그래서 type_codes에는 ID와 이름의 두 열이 있습니다. 그런 다음 환경 설정에서 유형 ID, 사용자 ID 및 값을 갖고 싶습니다. 환경 설정 테이블을 3 개의 열에 고정시키는 것처럼 보입니다. 그러나 country, region, city, county, latitute, longitude 등이 들어있는 'address'라는 속성이있는 경우이를 어떻게 처리해야합니까? 내가 제안한 모델을 사용하여 주소를 자체 테이블로 분리해야합니까? – DexterW

+0

@Greelmo : 주소 (우편물, 사무실 등)와 같이 일반적으로 그룹화 된 정보는 환경 설정이 아닌 자체 테이블로 모델링해야합니다. –

+0

@Greelmo : 또한 USER_PREFERENCES 테이블의'user_id'와'preference_type_code' 컬럼을 프라이 머리 키로 만들거나, 적어도 SQL 서버를 사용하는 경우 유일 컨 스트레인 트를가집니다. –

2

개인적으로 자연스러운 속성 그룹이 있는지 여부를 결정할 것입니다. 가장 일반적으로 사용자 테이블에 쿼리하고 다른 테이블은 테이블을 너무 넓히지 않기 위해 일대일 관계가있는 별도의 테이블에 배치 할 수 있습니다 (우리는 일반적으로 User_Extended와 같은 것을 호출합니다). 일부 속성이 자연 분류로 분류되는 경우 해당 속성은 대개의 경우 함께 쿼리되므로 별도의 테이블을 호출 할 수 있습니다.

속성을 살펴보면 몇 가지 항목을 하나의 열로 결합 할 수 있는지 검토해 볼 수 있습니다 (예 : 사용자가 인턴, 거주자, 참석자와 같이 3 가지 다른 것들을 시뮬레이트 할 수없는 경우). 하나의 필드를 가지고 3 비트 필드가 아닌 3 개의 필드로 데이터를 저장하는 것이 더 좋습니다. 특히 세 가지 필드 모두와 함께 case 문을 사용하여 원하는 정보 (제목)를 얻어야하는 경우에 특히 그렇습니다 다시 말하면 당신의 속성을 살펴보고 그들이 진정으로 분리되어 있는지 또는 더 일반적인 것으로 요약 될 수 있는지 확인하십시오.