2010-05-28 3 views
1

테이블의 열이 고정되지 않은 스키마를 디자인하려고합니다. 예 : 테이블의 열이 고정되어 있지 않고 가변적 인 Employee 테이블이 있습니다 (Employee의 특성은 고정되어 있지 않고 다양합니다). 새로운 속성/열의 빈번한 추가가 요구됩니다. 주소 테이블 주소를 생성 한 후 추가 할 열 경우 : Employee 테이블에서테이블의 열이 고정되지 않은 스키마를 디자인하는 방법

  1. Null 허용 열 자체가 개별 테이블 전에서에서 그 열을 구분하는 대신, 널 (NULL) 컬럼을 추가하는 더 정상화를

  2. 을 즉 없습니다 [EmployeeId, AddressValue].

  3. ExtensionColumnName [EmployeeId, ColumnName] 및 ExtensionColumnValue [EmployeeId, ColumnValue] 테이블을 만듭니다. ExtensionColumnName은 ColumnName을 "Address"로, ExtensionColumnValue는 ColumnValue를 주소 값으로 갖습니다.

    Employee 테이블
    는 직원 ID
    이름

    ExtensionColumnName 테이블
    ColumnNameId는

    이 ExtensionColumnValue 테이블

    ColumnNameId
    골을 직원 ID
    의 ColumnName

    를 직원 ID umnValue

스키마가 새로운 속성마다 변경되면서 처음 두 가지 방법이 있다는 단점이 있습니다. 새로운 속성을 추가하는 것은 빈번하고 요구 사항입니다.

좋은지 나쁜지 잘 모르겠습니다. 사람이 만들 수있는 유사한 결정이 있다면, 당신은을 사용하는 경우 하나의

Property: 
    EmployeeID foreign key 
    PropertyName string 
    PropertyValue string 

로 ExtensionColumn 테이블을 결합 등

답변

2

숫자 2와 3의 조합을 사용하는 것이 좋습니다. 가능한 경우 주소와 같은 표준 연결에 대한 모델 표를 작성하십시오. 이것은 가장 이상적인 접근법입니다 ...

그러나 항상 EMPLOYEES 표 외에 두 개의 테이블을 사용하는 것과 같은 논리 그룹으로 요약 될 수없는 값을 변화 :

  • EMPLOYEE_ATTRIBUTE_TYPE_CODES (두 개의 열 employee_attribute_type_code 및 DESCRIPTION)
  • EMPLOYEE_ATTRIBUTES을에서

를 (세 개의 열은 직원 외래 키 EMPLOYEE_ID EMPLOYEE_ATTRIBUTE_TYPE_CODES에 외부 키 employee_attribute_type_code 및 VALUE)

  • employee_attribute_type_code

이 같은 직원에 중복 속성을 중지 employee_id입니다 :가 만들어 질하는 기본 키를 설정합니다.

+0

OMG 조랑말, 결국 스키마를 생각해 냈습니다. 그러한 스키마 문제에 관심이 있습니다. 예 : EMPLOYEE_ATTRIBUTES의 VALUE 열이 ID (다른 테이블의 기본 키)이면 문제가됩니다. 이러한 속성은 조회 및 상응하는 조회 테이블 이름임을 나타내는 별도의 메타 테이블을 갖는 것으로 해결할 수 있습니다. 이것은 일부 동적 SQL 또는 반사를 포함하고 유형 안전을 잃게됩니다. – hIpPy

0

보고 외래 키/데이터 무결성, 인덱싱, 성능, 같은 것들에 대한 통찰력을 제공하십시오 모든 개체 테이블에 기본 키를 할당하는 단조 시퀀스, 단일 속성 테이블은 모든 개체에 대한 속성을 보유 할 수 있습니다.

1

관찰 패턴이라고하는 패턴이 있습니다. one, two, three : 설명은

는 이러한 질문/답변을 참조하십시오. 일반적으로

은 다음과 같습니다 : 예를 들어

observation_model_02

직원, 회사와 동물 모든 관찰 이름 (특성)이, 직원과 동물 과목이 가질 수있는 가질 수 과목 관찰 중량 (측정) 및 대상 맥주 병은 관찰을 가질 수있다 레이블 (특성) 및 볼륨 (측정). 그것은 모두 모델에 들어 맞습니다.

3

레코드 당 임의의 키 - 값 쌍을 저장할 수있는 NoSQL 데이터베이스의 현재 자르기를 살펴 보는 것이 유용 할 수 있습니다.

난 당신이 등 CouchDB를, MongoDB를, 루씬,보고 추천 할 것입니다 ...

만약이 특히보고와 함께, 악몽에서 끝나는 SQL 데이터베이스에 자주 스키마 변경.

(rowId, key, value) 트라이어드에 모든 것을 넣는 것은 매우 유연하지만 느린 속도입니다.

ERP 공급 업체가하는 방식은 확실한 필드의 스키마를 만들고 고정 된 명명 된 열에 "flexfields"(즉 20 개의 숫자, 20 개의 문자열 등)를 추가하고 어떤 flexcolumn가 무엇에 해당하는지 확인하기위한 룩업 테이블. 본질적으로 정적 스키마를 가지면서 미래에 대한 유연성을 허용합니다.

+0

ever 특성의 열을 추가하는 것은 "큰 소년이하는 방법"이 아닙니다. 주로 데이터베이스 당 테이블 수의 열 수에 하드 제한이 있기 때문에 (데이터 형식이 걱정되었지만 지금은 값싼 하드 드라이브 아르). 솔직히, 20 개 이상의 열이있는 테이블은 INSERT & UPDATE 문을 사용하여 다루기가 어렵습니다. –

+3

오라클 EBS에서 10000+ 테이블 모델을 생각하면서 뺨에 혀가 느슨하게 느슨하게 사용되었습니다. 다른 모든 테이블은 해당 자리 표시 자 열로 채워집니다. 개인적으로 나는 아주 못생긴 것을 발견하지만, 분명히 그들은 20 년 이상 동안 생존 해 왔습니다. 나는 그것이 대부분의 경우에 잘 작동하는 그 추악하고 실용적인 해결책 중 하나라고 생각한다. –

1

새로운 속성이 자주 추가되는 경우 EAV 데이터 모델이 적합 할 수 있습니다.

0

1과 2의 조합을 사용합니다. 속성을 자주 추가하는 경우 데이터 요구 사항을 처리 할 수 ​​있다고 생각하지 않습니다.

추가되는 속성 중 일부가 다른 테이블에 속한다고 생각됩니다. java 인증, asp 인증 등의 속성을 계속 추가하는 경우 인증 테이블이 필요합니다. 이는 사용 가능한 인증을 나열한 인증 코드 테이블과의 관계 일 수 있습니다.

manager와 같은 속성은 속성 또는 관계 테이블 일 수 있습니다. 직원 간 관계가 여러 개인 경우, 릴레이션 유형이있는 관계 테이블을 고려하십시오. 매트릭스 관리 구조가있는 조직에는 관련 테이블이 필요합니다.

주소와 전화 번호는 종종 별도의 테이블에 있습니다. employee_id, address_type과 같은 주소 키가 적합합니다. 기록이 필요한 경우 start_date 열을 키에 추가하십시오.

기록을 보관하려면 해당 열에서 start_date 및 end_date 열을 사용하는 것이 좋습니다. 나는 'start_date < = 날짜가 고려되는 < end_date'일 때 레코드가 활성화 된 관계를 사용하려고합니다. 무게, 눈 색깔 등의 속성

관련 문제