문제

테이블 제품 및 직원이있는 데이터베이스를 고려하십시오. 현재 제품 관리자를 모델링 해야하는 새로운 요구 사항이 있으며, 일부 제품은 제품 관리자가 필요하지 않을 정도로 간단하거나 성숙하다는 점을 지적합니다. 즉, 각 제품에는 0 또는 하나의 제품 관리자가있을 수 있습니다.

접근 1 : 알터 테이블 Product 새로운 것을 추가합니다 NULL유능한 열 product_manager_employee_ID 제품 관리자가없는 제품이 NULL 값.

접근 2 : 새 테이블을 만듭니다 ProductManagers 비로NULL유능한 열 product_ID 그리고 employee_ID, 독특한 제약으로 product_ID, 제품 관리자가없는 제품 이이 테이블에 행이없는 것으로 모델링됩니다.

다른 접근법이 있지만 이것들은 내가 가장 자주 만나는 두 가지입니다.

이것들이 합법적 인 디자인 선택이라고 가정하고 (내가 믿는 경향이있는 것처럼) 단지 다른 스타일을 나타내는 것만으로도 이름이 있습니까? 나는 접근 2를 선호하고 실제 예제를 사용하지 않고 접근 1을 선호하는 사람에게 스타일의 차이를 전달하기가 어렵다는 것을 알게됩니다 (여기서 한 것처럼!) "나는"나는 선호 할 수 있다면 좋을 것입니다. 경사-타운 -6nf (또는 무엇이든) 스타일을 스스로 스타일을 지정합니다. "

이러한 접근법 중 하나가 실제로 반포 반대라고 가정하면 (단지 두 엔티티 간의 관계를 해당 엔티티의 속성으로 모델링하여 접근 1의 경우가 될 수 있기 때문에)이 패턴은 이름이 있습니까?

도움이 되었습니까?

해결책

첫 번째는 일대일 관계 (많은 제품에 대한 직원)에 지나지 않습니다. 이것은 선택 사항 (모든 제품에 제품 관리자가있는 것은 아님)이기 때문에 때때로 O : M 관계 (0에서 많은 사람들)라고도합니다. 또한 모든 직원이 제품 관리자 인 것은 아니므로 다른 쪽에서도 선택 사항이 있습니다.

두 번째는 가입 테이블이며 일반적으로 다수의 관계에 사용됩니다. 그러나 한쪽은 일대일 일 뿐이므로 (각 제품은 한 번만 테이블에 있습니다) 실제로는 복잡한 일대일 관계 일뿐입니다.

개인적으로 나는 첫 번째를 선호하지만 잘못 (또는 나쁜)도 선호합니다.

두 번째는 떠오르는 두 가지 이유로 사용됩니다.

  1. 귀하는 제품에 하나 이상의 관리자가있을 가능성을 상상합니다. 또는
  2. 제품 관리자가 제품에 대한 역사를 추적하고 싶습니다. 한 번에 하나만 최신 상태 일 수있는 'y'(또는 유사한)로 설정된 current_flag 열로이를 수행합니다. 이것은 실제로 데이터베이스 중심 애플리케이션에서 매우 일반적인 패턴입니다.

다른 팁

그것은 두 가지 모델의 다른 행동처럼 보입니다. 첫 번째 예에서는 제품 당 하나의 제품 관리자를 가질 수 있고 한 명의 직원은 하나 이상의 제품 (1 ~ 많은)의 제품 관리자가 될 수 있습니다. 두 번째는 제품 당 하나 이상의 제품 관리자 (많은 것)를 허용하는 것으로 보입니다. 이는 두 가지 솔루션이 다른 상황에서 똑같이 유효하며 사용하는 솔루션은 비즈니스 규칙에 따라 다릅니다.

첫 번째 접근 방식에는 결함이 있습니다. 잠시 동안 비즈니스 요구 사항이 변경되었으며 이제 제품 관리자 2 개를 제품에 설정할 수 있어야한다고 상상해보십시오. 당신은 무엇을 하시겠습니까? 테이블 제품에 다른 열을 추가 하시겠습니까? 왝. 이것은 분명히 1NF를 위반합니다.

두 번째 접근 방식이 제공하는 또 다른 옵션은 특정 제품 관리자 <-> 제품 관계에 대한 일부 속성을 저장하는 기능입니다. 예를 들어, 제품의 제품 관리자 두 명이있는 경우 제품 중 하나를 기본으로 설정할 수 있습니다. 예를 들어 직원은 전화 번호를 가질 수 있지만 다른 전화를 가질 수 있습니다. 번호 ... 이것은 또한 특별 테이블로갑니다.

접근 1)

  1. 추가 제품 관리자 필드와 함께 제품 테이블의 사용을 속도로 느리게합니다 (아마도 모든 데이터베이스가 아니라 일부는).
  2. 제품 테이블에서 직원 테이블에 링크하는 것은 간단합니다.

접근 2)

  1. 제품 테이블을 사용하는 기존 쿼리는 영향을받지 않습니다.
  2. 데이터베이스의 크기를 증가시킵니다. 이제 제품 ID 열을 다른 테이블로 복제하고 해당 테이블에 고유 한 제약 조건과 인덱스를 추가했습니다.
  3. 제품 테이블에서 직원 테이블에 연결하는 것은 먼저 중간 테이블에 잉크를 잉크해야하므로 더 번거롭고 비용이 많이 듭니다.

두 테이블 사이를 얼마나 자주 연결해야합니까?

제품 테이블을 사용하는 다른 쿼리는 몇 개입니까?

제품 테이블에 몇 개의 레코드가 있습니까?

당신이주는 특별한 경우, 두 테이블의 주요 동기는 누락 된 데이터의 널을 피하는 것이며 이것이 두 가지 접근법을 특성화하는 방법이라고 생각합니다.

장단점에 대한 토론이 있습니다 Wikipedia에서.

나는 C 날짜가 이것을 싫어하는 것을 감안할 때, 그는 여러 테이블 솔루션 만 "유효한"관계 이론을 정의한다고 확신합니다. 예를 들어, 단일 테이블 접근법을 "제대로 타이핑"할 수 있습니다 (null 유형이 불분명합니다 -P4의 인용문 참조).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top