2009-02-27 15 views
3

나는 많은 필드가있는 테이블을 가지고있다. 작업 그룹의 프로젝트 관리자 정보와 같이 필드를 논리적 그룹으로 나눌 수 있습니다. 그룹화 자체는 실제로 엔티티 후보가 아니며 자체 PKs가 없어야합니다.db 테이블의 1 대 1 관계가 냄새가 있습니까?

지금은 그룹화하기 위해 필드에 접두사 (예 : PmFirstName)가 있지만 기본 테이블에서 1 : 1 관계가있는 여러 테이블로 분할하려고합니다.

내가 이것을 할 때주의해야 할 것이 있습니까? 이것은 가난한 선택일까요?

내 쿼리가 모든 추가 조인으로 인해 더 복잡해질 수 있지만보기가 올바르게 완화 될 수 있습니다. 우리가 100,000 개 미만의 레코드를 가진 테이블에 대해 이야기한다면 성능에 눈에 띄는 영향을 미치게 될 것입니다.

편집 : 나는 비 실체 후보들의 생각을 조금 더 정당화 할 것이다. 이 정보는 사용자 기반으로 입력됩니다. 그들은 서로에 대해 알지도 못한다. 따라서 동일한 사용자가 동일한 "projectManager 이름"을 제출하거나이 시점에서 어느 제약 조건을 위반하지 않을 수도 있습니다. 우리가 별도의 사용자로부터 엔트리를 상호 연관시키고 자한다면 나중에 파이프 라인을 결정할 것입니다. 이러한 것들을 그들 만의 열쇠로 주면, 주 테이블이 성장하는 것과 같은 비율로 성장할 것입니다. 왜냐하면 그것들은 본질적으로 동일한 개체의 일부이기 때문입니다. 아니오 pt는 사용자가 사용 가능한 "프로젝트 관리자"목록에서 선택합니다.

위의 내용에서 볼 때, 나는 그것이 엔티티라고 생각하지 않습니다. 그러나 어쩌면 아닙니다 - 당신이 더 생각을 가지고 있다면 게시하십시오.

+0

DUPE : http://stackoverflow.com/questions/517417/is-there-ever-a-time-where-using-a-database-11-relationship-makes-sense –

+0

"1 : 1 관계 "그 결과를 얻지 못했습니다. 속고에 ​​대한 죄송합니다 –

답변

4

특정 성능상의 이유가없는 한 일반적으로 1 : 1 관계를 사용하지 않습니다. 예를 들어 드물게 사용되는 대형 텍스트 또는 BLOB 유형 필드를 별도의 테이블에 저장하는 경우.

나는 여기에 뭔가 다른 일이있을 것이라고 생각합니다. 예제에서 PmFirstName을 주면 "ProjectManagers"또는 "Employees"테이블과 관련된 pm_id가 하나 있어야합니다. 그 그룹이 정말로 엔티티 후보가 아닌가?

+2

SQL Server 용? 얼룩은 일반 페이지 외부에 저장되므로 별도의 테이블에 있어야한다고 생각하지는 않습니다. –

2

일부 행이나 쿼리의 경우 여분의 열에 관심이 없으면 냄새가 난다. 예 : 쿼리의 많은 부분에 대해 PmFirstName 열을 선택하지 않았거나 열의 큰 하위 집합에 해당 열이 NULL 인 경우.

나는 냄새를 좋아한다.

0

필드 그룹이 엔티티 후보가 아닌 이유는 무엇입니까? 그들이 그렇지 않다면 왜 접두어로 그들을 식별하려고합니까?

접두사를 삭제하거나 자체 테이블에 추출하십시오.

2

상속과 유사한 구조에 대해 1 대 1 관계를 사용합니다.

예를 들어, 모든 채권에는 CUSIP, 쿠폰, DatedDate 및 MaturityDate와 같은 몇 가지 기본 정보가 있습니다. 이 모든 것이 메인 테이블에 있습니다.

이제 채권 (재무부, 기업, 무니, 대행사 등)의 각 유형에는 고유 한 열 집합이 있습니다.

과거에 우리는 그 모든 정보가 담긴 하나의 테이블을 가지고있었습니다. 이제 유형별 정보를 별도의 표로 나누어 성능을 향상시킵니다.

지금은 그룹화하기 위해 필드에 접두어 (예 : PmFirstName)가 있지만 주 테이블에서 1 : 1 관계가있는 여러 테이블로 분할하려고합니다.

사람 테이블을 만들려면 모든 데이터베이스가 필요합니다. 그런 다음 프로젝트 테이블에 person 테이블을 가리키는 PMKey 열이 있습니다.

0

다른 곳에서 사용할 수있는 별도의 논리 엔티티 인 경우 별도의 테이블로 분할하는 것이 중요합니다.

"프로젝트 관리자"는 현재 모든 프로젝트에서 1 : 1이 될 수 있지만, 나중에 프로젝트 관리자에게 프로젝트가 두 개 이상있을 수 있기를 원할 수도 있습니다. 그래서 여분의 테이블을 갖는 것이 좋습니다.

당신은 PrimaryFirstName, PrimaryLastName, PrimaryPhone, SecondaryFirstName, SecondaryLastName, SEcondaryPhone이있는 경우

당신은 그런 다음 원래의 표는 "PrimaryId 필요

이름, 성, 전화 번호와 함께"사람 "테이블을 가질 수 "및"SecondaryId "열을 사용하여 이전에 보유한 6 개의 열을 대체 할 수 있습니다.

또한 SQL을 사용하면 실제 위치에서 파일 그룹과 테이블을 분리 할 수 ​​있습니다. 그래서 1 : 1 관계를 갖는 POST 테이블과 COMMENT 테이블을 가질 수 있지만 COMMENT 테이블은 다른 파일 그룹에 위치하며 더 많은 메모리가있는 다른 물리적 드라이브에 있습니다.

1 : 1이 항상 냄새를 맡지는 않습니다. 그것이 목적이 없다면.