복붙노트

[SQL] 이 관계형 데이터베이스 모델 주소 정보에 좋은 방법인가?

SQL

이 관계형 데이터베이스 모델 주소 정보에 좋은 방법인가?

이것은 좋은 디자인 있는지 궁금 하군요. 나는 주소 정보 (예를 들어, 거리, 우편 번호 / 우편 번호, 국가, 팩스, 이메일)를 요구 테이블의 번호를 가지고있다. 때로는 같은 주소가 여러 번 반복됩니다. 예를 들어, 주소는 그들에게 전송 된 각 구매 주문에 다음 공급 업체에 저장 될 수있다. 공급자는 그들의 주소를 변경할 수 있으며, 이후의 구매 주문은 새 주소가 있어야합니다. 그것은 더이보다 복잡하지만 그 예를 들어 요구 사항입니다.

옵션 1 다양한 테이블에 속성으로 모든 주소 열을 넣습니다. 이 만들어진으로 PO에 공급 업체에서 세부 사항을 복사합니다. 잠재적으로 여러 복사본을 저장

옵션 2 별도의 주소 테이블을 만듭니다. 주소 테이블에 공급 업체 및 구매 주문 테이블에서 외부 키를 가지고있다. 만 삽입 할 수 및 업데이트가 더 당신이 의도 한 것보다 변경할 수 있기 때문에 주소 테이블에 삭제합니다. 그럼 내가 사용하지 않는 행에 대해 왼쪽되지 않은, 그래서 더 이상 아무것도에 의해 참조되지 않는 주소 테이블에서 모든 행을 삭제 일부 예약 된 작업을 할 것입니다. 아마 또한 정지 중복에 주소 테이블의 모든 비 PK 컬럼에 고유 제한 조건을 가지고뿐만 아니라.

내가 옵션 2쪽으로 생각이 기울고있어 더 좋은 방법이 있나요?

편집 : 보낼 때 그것이 나는이 구매 주문에 주소를 유지해야합니다. 또한, 좀 더 배달 주소와 대금 청구 주소 (주소 정보를 다른 테이블의 무리도있다)이있을 수 있으므로 내가 제안하는 것이 복잡합니다.

한꺼번에-자신의 날짜를 기준 잠시 후, 나는 옛 구매 주문을 삭제합니다. 그것은 아무것도에 의해 더 이상 참조되지 않은 주소 기록을 수집하는 쓰레기에 의도 된 것이이 이후 (그렇지 않으면 느낌이 나는 누출을 만드는 것 같은).

해결법

  1. ==============================

    1.실제로 인터뷰 질문 중 하나로 사용합니다. 다음은 시작하기에 좋은 장소입니다 :

    실제로 인터뷰 질문 중 하나로 사용합니다. 다음은 시작하기에 좋은 장소입니다 :

    Addresses
    ---------
    AddressId (PK)
    Street1
    ... (etc)
    

    AddressTypes
    ------------
    AddressTypeId
    AddressTypeName
    

    UserAddresses (substitute "Company", "Account", whatever for Users)
    -------------
    UserId
    AddressTypeId
    AddressId
    

    이 방법은, 당신의 주소가 어떻게 사용되고 있는지 전혀 모르고, 당신의 엔티티 (사용자, 계정)을 직접하거나 주소에 대해 아무것도 몰라. 그것은 당신이 작성하는 연결 테이블에 대한 모든이야 (이 경우 UserAddresses,하지만 당신은 당신의 모델에 맞는 무엇이든 할 수 있습니다).

    잠재적으로 큰 데이터베이스에 대한 다소 모순 된 충고의 한 조각이 : 앞으로 가서 "HasMoreAddresses"필드와 함께 (이 경우 사용자 테이블에) 당신의 기관에 직접 "차"주소를 넣어. 그냥 위의 깔끔한 디자인을 사용하는 것에 비해 구역질 보이지만, 일반적인 사용 사례 코딩 단순화 할 수 있으며, 비정규 성능에 큰 차이를 만들 수 있습니다.

  2. ==============================

    2.의심 할 여지없이 옵션 2.

    의심 할 여지없이 옵션 2.

    다음과 같은 몇 가지 사항을 염두에 두어야합니다 : 그것은 주소가 서로 연결되어있는 경우 사용자에게 표시하는 디자인의 중요한 측면이다. 즉 배송 주소와 동일하게되고 기업의 주소; 그들이 배송 주소를 변경하려면, 그들도 회사 주소를 변경하려면, 또는 새로운 하역장을 지정하려면 어떻게합니까? 물건이 정렬 및 단위의 종류와이 정보와 변경 일에 존재하는 사용자에게 능력은 매우 중요하다. 이 업데이트에 관한 역시 중요하다 사용자에게 "분할"항목에 입도 (granularity)를 제공합니다. 아니 UI 이런 종류의 디자인에 쉽다는 것을; 사실의 점에서, 그것은 나쁜입니다. 그러나 그것은 할 정말 중요한; 아무것도 적은 거의 확실하게 사용자가 매우 좌절과 짜증하게됩니다.

    또한; 난 강력하게 이전 주소 데이터 주위에 유지 권하고 싶습니다; 그것을 청소하는 프로세스를 실행하지 않습니다. 당신은 매우 바쁜 데이터베이스가 없다면, 데이터베이스 소프트웨어는 여분의 데이터를 처리 할 수있을 것입니다. 정말. 나는 데이터베이스에 대해보고 한 일반적인 실수는 overoptimize을 시도; 당신이 할 쿼리의 지옥을 최적화 할,하지만 당신은 사용되지 않는 데이터를 최적화하고 싶지 않아요. (데이터베이스 활동이 매우 높은 경우 다시, 당신은 무언가가이 작업을 수행해야 할 수도 있습니다,하지만 거의 데이터베이스가 여전히 테이블에 주위를 초과하는 데이터를 갖는 잘 작동하는 확신합니다.) 대부분의 경우, 실제로 더 유리입니다 그것을 최적화를 시도하는 것보다 간단하게하려면 데이터베이스가 증가 할 수 있습니다. (삭제는 당신의 테이블에서 산발적 데이터는 데이터베이스의 크기에 상당한 감소가 발생하지 않습니다, 그리고 그렇게되면 ... 음, 그 원인은 데이터베이스에 거대한 드레인 될 수 있음을 다시 인덱스.)

  3. ==============================

    3.나는 JohnFx에 동의 생각 ..

    나는 JohnFx에 동의 생각 ..

    당신이 국가를 포함 할 때문에 (snail-) 메일 주소에 대한 또 다른 것은, 당신이 제공 할 / 메일을 국제적으로, 주로 자유형 텍스트를 주소 필드를 보관하십시오 가정합니다. 그것은 노르웨이 지퍼 코드가없는 5 자리 우편 번호를 구성하는 데 정말 짜증나, 우리는 4 자리 포스트 수 있습니다.

    가장 좋은 분야는 다음과 같습니다

    이것은 미국 우편 시스템이 특정 형식의 지퍼 코드가 필요한 경우, 다음 그것도 포함하지만, 미국 국가로 선택하지 않는 한이 선택하게 꽤 세계적인해야합니다. 어떻게 자신의 나라에서 주소를 포맷하는 모든 사람을 알고, 그래서만큼 당신이 줄 바꿈을 유지으로는 괜찮을 것 같네요 ...

  4. ==============================

    4.당신이 주소가 구매 주문에 원래 있었는지의 역사적 기록을 유지 하시겠습니까?

    당신이 주소가 구매 주문에 원래 있었는지의 역사적 기록을 유지 하시겠습니까?

    예 옵션 1 가면, 그렇지 않으면 공급 업체 테이블에 저장하고 공급 업체에 각 구매 주문을 연결합니다.

    BTW : 가난한 DB 디자인의 확실한 표시는 데이터 "정리"또는 동조를 유지하는 자동화 된 작업에 대한 필요성이다. 옵션 2는 아마 그 측정에 의한 나쁜 생각

  5. ==============================

    5.왜 주소 테이블에있는 행의 사용되지 않는 될 것입니다? 분명히 그들은 여전히 ​​사용 구매 주문서가 가리키는 것입니까?

    왜 주소 테이블에있는 행의 사용되지 않는 될 것입니다? 분명히 그들은 여전히 ​​사용 구매 주문서가 가리키는 것입니까?

    중복을 중지하는 것은 따라서 어떤 정리의 필요성을 부정, 우선 순위가 될 것을 나에게 보인다.

  6. ==============================

    6.주문의 경우, 주문이 전송되었습니다 경우 변경 한 사람 (또는 회사) 주소로 주소를 업데이트하고 싶지는 않을 것입니다. 당신은 순서에 문제가있는 경우 순서가 실제로 전송 된 위치의 기록을 MEED.

    주문의 경우, 주문이 전송되었습니다 경우 변경 한 사람 (또는 회사) 주소로 주소를 업데이트하고 싶지는 않을 것입니다. 당신은 순서에 문제가있는 경우 순서가 실제로 전송 된 위치의 기록을 MEED.

    주소 테이블은 좋은 아이디어이다. 같은 엔티티가 중복 된 주소를 가질 수 있도록에 고유 제한 조건을 확인하십시오. 사용자가 그들을 찾는 대신 다른 하나를 추가 할 수 있기 때문에 당신은 여전히 ​​그들을 얻을 수 있으며, 그들은 약간 다르게 (대신 거리의 성을) 물건을 주문하면 고유 제한 조건은 방지하지 않습니다. 순서는 순서로 작성 될 때 데이터를 복사합니다. 이것은 당신이 어디에 보내 어떤 역사적 기록을 필요로하기 때문에 당신이 여러 레코드를 원하는 한 경우입니다. 만 그렇지 않은 업데이트보다 안전하고 데이터베이스에 대한 더 많은 작업을 포함로 테이블에 삽입과 삭제가 나에게 아무 의미있게. 업데이트는 데이터베이스에 하나의 호출에서 이루어집니다. 주소가 당신의 아이디어에 변경하는 경우에, 당신은 먼저 이전 주소를 삭제해야하고 새로운 하나를 삽입합니다. 뿐만 아니라 더는, 데이타베이스하지만 코드 오류를 만드는 두 번 기회를 호출합니다.

  7. ==============================

    7.나는 옵션을 데이터 품질 문제로 1 개 GET을 사용하는 모든 시스템을 보았다. 오년 후 모든 주소의 30 %는 더 이상 현재 없습니다.

    나는 옵션을 데이터 품질 문제로 1 개 GET을 사용하는 모든 시스템을 보았다. 오년 후 모든 주소의 30 %는 더 이상 현재 없습니다.

  8. from https://stackoverflow.com/questions/307027/is-this-a-good-way-to-model-address-information-in-a-relational-database by cc-by-sa and MIT license