4

리무진 회사 용 데이터베이스를 구축하려고하는데 고객, 운전자, 제휴사 및 주문과 관련된 주소에 대해 정규화가 얼마나해야하는지에 대해 고민했습니다.주소에 대한 데이터베이스 정규화

는 기본적으로 제휴 및 드라이버의 주소는 다음과 같습니다 : address_line_1, address_line_2, 도시, 주, 우편 번호,

내 문제가 주문 및 고객 주소에서 오는 국가를. 그들은 다음과 같아야합니다 : address_line_1, address_line_2,시,도, 우편 번호, 국가, address_type_1 (집, 직장), address_type_2 (픽업, 드롭 오프 - 주문에만 포함하면됩니다.)

그래서 모든 4 개의 테이블 사이에는 고객 필드와 주문 테이블이 다른 두 필드를 제외하고 주소 필드에 유사점이 있습니다.

모든 레코드가 고유 ID로 식별된다는 점을 언급해야합니다. 예 :

고객 ID - 10,000 - 99,999

주문 ID - 100000 - 제한 없음

드라이버 ID - A1 - A999 (아마도)

제휴 ID - 1000 - 9999

이것들은 단지 예일 뿐이므로 이해하는데 많은 시간을 소비하지 마십시오.

정규화 된 데이터베이스를 만드는 데 몇 개의 주소 테이블을 사용해야합니까?

  1. 한 주소 테이블의 모든 필드를 포함하여 플러스 주소의 유형 (고객, 주문, 제휴, 드라이버)를 설명하는 별도의 하나를이 순간에

    나는 내 마음 속에 세 가지 아이디어를 가지고있다. 이건별로 좋아하지 않아.

  2. 2 개의 주소 테이블. 하나는 운전자 및 계열사이고, 다른 하나는 고객 및 주문입니다. 두 번째 테이블에 대해서는 고객에게 항상 NULL이 될 필드가 있습니다. 이것도 맘에 들지 마라.

  3. 세 개의 주소 테이블. 하나는 운전자 및 계열사 용이고 하나는 고객 용이고 다른 하나는 주문 용입니다. 사용하지 않는 필드가 없기 때문에 다른 두 필드보다 더 나은 옵션이 될 수 있다고 생각하게됩니다.

누구나이 세 가지 옵션 또는 더 나은 옵션에 관한 조언을 제공합니까?

고마워요.

UPDATE :

이 테이블 ID의 번호 체계에 대해 아직 걱정하지 마십시오. 그것은 단지 예일뿐입니다. 나는 여전히 최고의 넘버링 시스템을 이해할 시간이 없었다. 일단 내 문제가 해결되면 문제가 해결 될 것입니다.

매트의 대답에서 나는 운전사를 떠나고 주소가 포함 된 테이블을 떠나고 어떻게 든 고객과 주문 테이블을 정리하려고한다.

고객이 쉽게 액세스 할 수 있도록 프로필에 저장하려는 여러 주소 (집, 직장 1, 직장 2, 즐겨 찾는 장소 등)를 고객이 가질 수 있기 때문에 분명히 주소 표가 필요합니다.

문제의 방정식을 조금 바꿀 수있는 주문 테이블에 대해 언급하는 것을 잊어 버렸습니다. 모든 주문에 대해 PICK-UP 및 DROP-OFF 위치가 필요합니다. 그러나 이것은 주소 (거리 주소) 또는 공항 일 수 있습니다. 즉, 번지와 관련된 필드는 공항 특정 필드와 일치 할 수 없습니다. 그래서 4 개의 엔티티 (pu_address, pu_airpot, do_address, do_airport)를 테이블 (모든 특정 필드가있는) 안에두면 사용하지 않는 공간과 프로그래밍 혼란에 빠질 것이라고 확신합니다. 예 : 픽업 필드에 대해 : Address_type, Address_line_1, ..., 주, 국가, 공항, 항공사, Flt 번호, ... 및 픽업과 동일한 내용을 삭제하십시오.

그래서 전진하는 방법에 대해 잘 모르는 주문 테이블에 여전히 문제가 있습니다. 여분의 테이블을 사용하거나 사용하지 않고 주소와 공항 픽업 및 드롭 오프 장소가 모두 필요합니다.

업데이트 감사합니다. Matt. 첫째, 네, 별도의 필드에 주소를 저장합니다. 주문에 대한 문제는 여전히 남아 있습니다. 나는 어떤 유형의 우레탄에 대한 예를 제시하고 리무진 서비스를 사용합니다. 주소 : 123 Main St, Chicago, Il, 60640; 공항 : ORD, AA, 123. 나는이 모든 밭을 어떤 식 으로든 테이블에 통합해야합니다.

옵션 : 주문 테이블

ORDER_ID, ..., 공항, 필드, 모두 공항과 주소 필드 드롭 오프 필드에 주소를 모두 가질 필요가 픽업 필드.

이 옵션은 여전히 ​​적합하지 않습니다.

다음으로 두 개의 여분의 테이블이 있어야합니다. 하나는 주소 (픽업 또는 드롭 오프를 인식하는 필드 포함)입니다. 다른 하나는 공항을위한 것입니다.

주문 레코드에 대한 정보를 검색하기 위해 두 가지 쿼리를 수행해야하기 때문에이 옵션도 마음에 들지 않습니다. 먼저 주문 정보를 검색하고 픽업 및 드롭 오프 (공항 또는 주소) 유형을 알고 나면 특정 픽업 및 드롭 오프 정보를 검색하는 또 다른 쿼리를 수행합니다.

그래서 다시 ... 내가 뭘 잘못하고 있니? 내가 놓친 게 있니?

그리고 네, 확실히 일부 주소록이 올바른지 확인 시스템을 사용할 것입니다.

답변

3

실제로 주소 확인 업계에서 주소 처리 및 저장이 전문 분야 인 SmartyStreets으로 근무하고 있습니다. 제 경험에 비추어 볼 때 여러분의 경우와 비슷한 상황을 많이 보았습니다.

처음에는 레코드 유형에 따른 분류 ID 번호와 관련이 있습니다. 네 가지 유형의 레코드 (고객, 운전자, 제휴사, 주문)가 다른 테이블에 저장되어있는 경우 왜 ID 범위 제한이 필요합니까? (업데이트 :이 문제는 실제로는 주요 문제가 아닙니다 ...)

이제 데이터베이스 디자인에 대해 알아보십시오.이상적으로는 디자인에 주소 데이터에만 연결되지 않고 핵심 도메인 (즉, 고객, 주문, 드라이버 등)의 운영을 반영해야합니다. 주소가 중요 할 수도 있지만, 핵심 업무는입니다. 이 근거와 내가 처음 작성한 게시물에서 수집 한 정보를 바탕으로 실제 레코드와는 별도로 주소를 저장하는 것을 주저합니다.

각 테이블에 비슷한 필드가 있지만 이들은 서로 다른 비즈니스 목적을 나타내며 사용되지 않는 불필요한 필드는 위험하지 않습니다. 그래서 질문은 " 주소 테이블을 만드는 방법"이 많지 않으므로 주소의 경우에만 테이블을 만드는 것이 더 좋습니다.

주소는 다양한 형태와 형태로 제공되지만 리무진 회사는 올바른 주소 정보를 갖고 데이터베이스를 표준화해야합니다. USPS (미국 기반이라고 가정)는 특정 공급 업체가 주소 정규화 서비스를 제공하고 있음을 인증합니다. 이것은 CASS ™ 인증입니다. CASS ™ 서비스를 통해 각 주소를 실행하면 완료됩니다. 주소는 똑같이 보이고, 완전한 정보를 갖고 있으며, 전달 가능할 것입니다. 나는 너의 수색을 가리키는 것을 시작하는 것이 좋습니다 LiveAddress, 주소를 확인할 때 가리킨다 또는 CASS list scrubbing service, 한 번에 주소의 배치를 확인하고 (중복 경고).

업데이트 : 고객이 여러 주소를 사용하는 경우 고객이 가지고있을 수 있으며, 그렇다면 별도의 테이블을 사용하도록 권유합니다. 그러나 CASS로 표준화/검증을하고 싶으므로 필요하다면 나중에 중복을 제거 할 수 있습니다 (실제로 주소가 실제로 있음을 알 수 있습니다).

그렇기 때문에 각 주소를 연결된 실제 레코드와 함께 인라인으로 저장하는 것이 좋습니다 (별도의 표에는 없음).

추가 질문이나 지시 사항이 있으시면 개인적으로 지원해 드리겠습니다.

UPDATE

공항에서 주소를 분리 소개

: 그 잠재적 비즈니스 요구에 따라 유효한 구분하지만 공항도 주소가 있음을 기억하십시오. "O'Hare 국제 공항"과 같이 주소가 가리키는 회사 또는 위치의 이름을 저장하기 위해 테이블에 필드를 추가 할 수 있습니다. 이렇게하면 몇 가지 필드를 통합 할 수 있습니다. 또한 주소 (Street, City, State, ZIP 등)별로 별도의 필드에 주소를 저장하는 것이 좋습니다.

+1

매트 - 주소를 사용하는 방법과 사용되는 데이터의 양에 따라 추가 할 수도 있습니다. 일반적으로 흔치 않은 주소를 다른 테이블로 분리하는 것이 가장 좋습니다. 이렇게하면 데이터베이스의 레코드 페이지 크기에 따라 성능이 향상 될 수 있습니다. 그러나 성능상의 이유로 여기서는 적용되지 않을 수 있습니다. – tsells

4

너무 늦었 지금 아마, 그러나 이것은 표준 정규화 규칙을 따라야하는 것처럼 나는 1 개 Addresses 테이블 (address_id, address_line_1, address_line_2, city, state, zipcode, country, address_type (FK AddressTypes 표))를 제안했다. Orders 테이블에는 Addresses 테이블 (pickup_address_iddelivery_address_id)과 두 개의 외래 키 관계가 있습니다. Customers, DriversAffiliates 테이블의 디자인과 관련하여 궁금한 점이 있지만 정확히 어떻게 관련되어 있는지 더 잘 이해하지 못하면 솔루션을 처방하기가 어렵습니다.

하나의 옵션 (하지만 당신에게 맞는 하나의 경우 나도 몰라)를 Parties 테이블이하는 것 (party_id, party_type) 슈퍼/하위 관계를 생성하는 (1-1 또는 제로에 각각의 경우)는 Customers, DriversAffiliates이며, 모두 Party입니다. 더 나은 이해를 위해 데이터 모델링에 대한 David C. Hay의 기사 중 하나 또는 두 개를 읽는 것이 좋습니다.