2011-03-12 5 views
0

ID, 이름, 날짜, WorkerId, VehicleId (및 50 개 이상의 필드)와 같은 작업에 대한 데이터가있는 테이블이 있습니다.테이블의 중복을 피하십시오

사용자가 주문으로 작업을 삽입하는 주문 모듈을 만들고 싶습니다. 주문에는 WorkerId 및 VehicleId (예 : 작업 테이블에 50 개 이상의 필드가 있음)와 같이 작업의 하위 집합 필드가 포함됩니다. 각 사용자는 주문을 작성하는 필드 정의를 선택할 수 있으므로 작업 테이블을 복제하고 주문 테이블 이름을 지정해야합니다. 작업 테이블의 큰 크기 (필드 측면에서) 때문에 중복되지 않도록하고 싶습니다. 작업 테이블과 같은 거대한 테이블을 생성하지 않는 주문 데이터를 저장할 수있는 방법이 있습니까?

P. 다음과 같은 이유로 작업 테이블에 주문을 저장하고 싶지 않습니다. 1. 성능에 영향을 줄 수있는 많은 주문이 있습니다. 2. 이미 많은 작업이 있습니다.

답변

0

설명에서 분명히 알기는 어렵지만, "작업"테이블의 열을 주문의 광고 항목으로 취급하려는 것처럼 들립니다.

ord_num line_item task_attribute attribute_value 
-- 
15  1   WorkerId   35 
15  2   VehicleId   101-345-2A3574 

하지만, 내가

  • 가 사용자에게 위해 작업을 수 있도록 나에게 의미가 않는 것을 말해야한다,라고하는 데,하지만
  • 것은 그것은 나에게 이해가되지 않습니다 사용자가 작업 테이블에서 하나 또는 두 개의 열을 주문하게하십시오. WTF는 어쨌든, 의미 않음 -

특히 단지 작업 테이블에서 하나 개 또는 두 개의 ID 번호를 주문하려면?

+0

그것은 많은 연결을 가진 매우 중복 된 시스템이며, 논리적이지 않은 것처럼 들리도록 정말 간단하게 만들려고 노력했습니다. 하지만 나를 믿어 라. 당신의 솔루션에 대한 문제는 외래 키를 사용할 수 없다는 것과 이것이 거대한 마이너스라고 생각합니다. – Naor

+0

@Naor : "tasks"테이블에 외래 키를 설정해야하는 경우 사용자가 열을 선택할 수 있도록 할 수 있습니까? 외래 키는 기본 키 또는 고유 제한 조건이있는 열 또는 열 집합을 참조해야합니다. –

1

작업 표에 is_order 필드를 추가하고 해당 값이 주문일 경우 true로 설정하고 작업 일 경우 false로 설정할 수 있습니다.

주문이나 작업이 포함될 수 있음을 보여주기 위해 테이블의 이름을 바꿀 수도 있습니다.

+0

나는 내 질문을 업데이트했다. 나는 업무와 명령을 결합하고 싶지 않다. – Naor

+0

@Naor : 성능을 향상 시키려면 색인을 추가 할 수 있습니다. –

+0

나는 그것을하지 않는 이유가 많이 있으며 많은 이야기를 쓸 수 있고 많은 시간을 낭비 할 수 있습니다. 나는 테이블을 싸우고 싶지 않습니다. 제 도움으로 저를 도우려고 노력하십시오. – Naor

1

제대로 이해하면 새 테이블을 만들고 싶지만 50 개 이상의 열을 원하지는 않습니다. 그게 맞습니까?

Orders(ID, Configuration)과 같이 할 수 있습니다. 여기서 구성은 모든 선택적인 데이터의 일부 문자열 표현입니다. 또는 Orders(ID, FieldID, FieldValue)과 같은 작업을 수행 할 수도 있습니다. 이 경우 주문에 3 개의 선택 필드가있는 경우 테이블에 3 개의 다른 행으로 표시됩니다. 두 가지 방법 모두 당신이 질의를 원할 때 어려움을 야기합니다. 나는 총알을 물고 단지 열 테이블을 가지고 있다고 생각합니다.

+0

Catcall의 대답에 덧붙여서 귀하의 것과 비슷한 코멘트를 참조하십시오. – Naor

+0

FK가 중요한 경우 50 열 테이블이 더 필요하다고 생각합니다. – joelt

1

작업에 50 개의 필드가있는 경우 해당 테이블은 비정규 화됩니다. "매우 중복 된 시스템"인 경우 데이터베이스가 정규화되지 않았습니다. 정규화되지 않은 테이블은 확장하기 어렵고 기능 확장에 심각한 제한을 두는 것을 알고있는 것처럼 보입니다.

주문을 추가하고 작업 또는 작업 구성 요소와 연결하여 복제를 복잡하게하기 전에 먼저 작업을 정규화해야합니다. 그러면 Task가 관련되어있는 여러 개의 정규화 된 테이블 (Person, Vehicle, Worker)이 생기고 Order를 추가하고 Order를 해당 테이블에 연관시키는 것이 간단해질 것입니다.

+0

테이블이 정규화되어 있고 테이블에 이미 노동자, 차량 등이 있습니다. – Naor

+1

@ Naor. 그거 좋네. 이 경우 작업 (색인 포함)과 관련된 모든 테이블의 DDL을 게시하십시오. 우리는 주문이 아닌 적절한 테이블에 주문을 연결할 수 있습니다. – PerformanceDBA

관련 문제