[SQL] 모델 고객에게 가장 좋은 방법 <-> 주소
SQL모델 고객에게 가장 좋은 방법 <-> 주소
모든 고객은 실제 주소 및 선택적 우편 주소가 있습니다. 이 모델링 선호하는 방법은 무엇입니까?
옵션 1. 고객이 주소로 외래 키를 가지고
Customer (id, phys_address_id, mail_address_id) Address (id, street, city, etc.)
옵션 2. 고객이 일대의 필드를 포함 주소에 관계를 가지고 주소 유형을 설명하는
Customer (id) Address (id, customer_id, address_type, street, city, etc.)
옵션 3. 주소 정보는-해제 정규화 및 고객에 저장됩니다
Customer (id, phys_street, phys_city, etc. mail_street, mail_city, etc.)
내 재정 목표 중 하나는 객체 관계형 매핑을 단순화하기 위해, 그래서 첫 번째 방법으로 기울고 있어요. 당신의 생각은 무엇입니까?
해결법
-
==============================
1.나는 정상화의 모든 일반적인 이유는 첫 번째 방법으로 경향이있다. 이 방법은 또한 쉽게 메일 링 세부 사항에 데이터 정리를 수행 할 수 있습니다.
나는 정상화의 모든 일반적인 이유는 첫 번째 방법으로 경향이있다. 이 방법은 또한 쉽게 메일 링 세부 사항에 데이터 정리를 수행 할 수 있습니다.
당신이 가능하게 할 수 있도록하려는 경우 여러 개의 주소 (메일, 주거 등) 또는 소원이 방법을 고려, 효과적인 날짜를 사용할 수 있도록
Customer (id, phys_address_id) Cust_address_type (cust_id, mail_address_id, address_type, start_date, end_date) Address (id, street, city, etc.)
-
==============================
2.당신이 (당신의 문제 도메인에 따라) 고려해야 할 한 가지 중요한 사실은 사람들이 주소를 변경하고 자신의 주소 변경을 사전에 알 수 있도록 할 수있다; 이 유틸리티 기업, 통신 사업자, 등 확실히 사실이다
당신이 (당신의 문제 도메인에 따라) 고려해야 할 한 가지 중요한 사실은 사람들이 주소를 변경하고 자신의 주소 변경을 사전에 알 수 있도록 할 수있다; 이 유틸리티 기업, 통신 사업자, 등 확실히 사실이다
이 경우 주소가 사전에 설정하고 자동으로 올바른 지점에서 전환 할 수 있도록하는 것이, 유효 날짜와 고객에 대한 여러 개의 주소를 저장하는 방법이 필요합니다. 이 요구 사항, (2)에 다음의 변형 인 경우, 예를 들어, 그것을 모델링 할 수있는 유일한 합리적인 방법입니다
Customer (id, ...) Address (id, customer_id, address_type, valid_from, valid_to)
이 음식을 장만 할 필요가없는 경우 반면에, (당신은 확실 당신은하지 미래에) 다음 아마 (1)이 더 문제가 없습니다으로 데이터 무결성을 유지하는 것이 훨씬 쉽기 때문 관리하는 간단 동일한 유형의 하나 개의 주소를 보장 존재하고, 그들이 하나 개의 필드에만있어로 간단하게 조인.
그러니 '(1) 또는 (2) 미세 당신이 집으로 이동을 필요로하는지 여부에 따라,하지만 난 당신에게 (3) 다음 주소가 테이블에 무엇의 정의를 반복하고 있기 때문에 놀지, 그리고 것 당신이 주소 외모 좋아하는 것을 변경하는 경우 여러 열을 추가해야 할 것이다. 그것은 약간의 가능성이 더 성능이 좋은,하지만 당신이 얻을 수있는 많은이없는 관계형 데이터베이스에 조인 제대로 인덱스를 처리 할 때 정직하게, 그것을 당신이 주소를 필요로하지 않는 일부 시나리오에서 느린 될 가능성이 높습니다 고객에 대한 레코드 크기가 커집니다.
-
==============================
3.우리는이 같은 모델을 추진하고있다 :
우리는이 같은 모델을 추진하고있다 :
Person (id, given_name, family_name, title, suffix, birth_date) Address (id, culture_id, line1, line2, city, state, zipCode, province, postalCode) AddressType (id, descriptiveName) PersonAddress (person_id, address_id, addressType_id, activeDates)
대부분이 과도한을 고려할 수 있습니다. 사람, 조직, 주소, 전화 번호, 등 - - 그리고 그들은 모두 희망 다른 방법으로 그들을 결합하는 그러나, 우리가 개발하는 응용 프로그램 사이 부인할 수없는 공통 주제들은 이러한 근본적인 실체의 일부가 것입니다. 그래서 우리는 우리가 우리가 사용 사례가 100 % 확신하는 것이 선행 약간의 일반화에 구축하고 있습니다.
주소 테이블은 문화에 따라 차별화 주소 테이블 당 계층 구조 상속 방식을 따릅니다; 그래서 미국 주소는 주 및 우편 번호 필드가되지만, 캐나다 주소는 주 및 우편 번호를해야합니다.
우리는 사람 "주고"에 주소를 별도의 연결 테이블을 사용합니다. 이것은 우리의 다른 엔티티를 유지 - 사람 및 주소 - 다른 엔티티들에 대한 관계에서 자유를 우리의 경험이 도로 아래로 복잡한 문제 경향이 때. 또한 기관의 많은 다른 종류의 (사람, 조직 등) (내 예 activeDates 같은) 링크와 관련된 다른 문맥 정보에 연결 주소 엔티티가 훨씬 간단합니다.
-
==============================
4.두 번째 옵션은 아마 내가 갈 것이 방법이 될 것입니다. (당신이 그들을 그렇게 드리고자 경우) 및 오프 - 기회에 그들이 운송 등을위한 의지 사이를 전환 할 수 있다는, '사용자가 추가 주소를 추가 할 것입니다.
두 번째 옵션은 아마 내가 갈 것이 방법이 될 것입니다. (당신이 그들을 그렇게 드리고자 경우) 및 오프 - 기회에 그들이 운송 등을위한 의지 사이를 전환 할 수 있다는, '사용자가 추가 주소를 추가 할 것입니다.
-
==============================
5.나는 # 1을 선호하는 것입니다. 좋은 정상화 명확하게 의도를 전달합니다. 이 모델은 또한 동일한 주소 객체 (행) 모두 주소를 사용할 수 있습니다, 뭔가가 나는 매우 가치있는 것으로 나타났습니다. 너무 많은 정보를 복제 길을 잃었 너무 쉽다.
나는 # 1을 선호하는 것입니다. 좋은 정상화 명확하게 의도를 전달합니다. 이 모델은 또한 동일한 주소 객체 (행) 모두 주소를 사용할 수 있습니다, 뭔가가 나는 매우 가치있는 것으로 나타났습니다. 너무 많은 정보를 복제 길을 잃었 너무 쉽다.
-
==============================
6.질문에 그런 종류의 답변을 때 나는 DDD의 분류를 사용하는 것을 좋아합니다. 그것은 기업의 경우이 값 객체 말아야의 경우는, 별도의 ID가 있어야합니다.
질문에 그런 종류의 답변을 때 나는 DDD의 분류를 사용하는 것을 좋아합니다. 그것은 기업의 경우이 값 객체 말아야의 경우는, 별도의 ID가 있어야합니다.
-
==============================
7.옵션 3은 너무 제한적이며, 옵션 1은 스키마를 변경하지 않고 다른 주소 유형을 허용하도록 확장 할 수 없습니다. 옵션 2는 분명 가장 유연하고, 따라서 최선의 선택입니다.
옵션 3은 너무 제한적이며, 옵션 1은 스키마를 변경하지 않고 다른 주소 유형을 허용하도록 확장 할 수 없습니다. 옵션 2는 분명 가장 유연하고, 따라서 최선의 선택입니다.
-
==============================
8.대부분의 코드에서 나는 모든 고객 하나 하나의 물리적 위치가 현재 물품. 이것은 우리의 비즈니스 파트너를 beeing는 법인입니다. 그러므로 나는 고객 개체 / 테이블, 도시 등 거리를했습니다. 종종이 작품이 가능한 간단한 일이며 작동합니다.
대부분의 코드에서 나는 모든 고객 하나 하나의 물리적 위치가 현재 물품. 이것은 우리의 비즈니스 파트너를 beeing는 법인입니다. 그러므로 나는 고객 개체 / 테이블, 도시 등 거리를했습니다. 종종이 작품이 가능한 간단한 일이며 작동합니다.
추가 우편 주소가 필요한 경우, 나는 훨씬에 고객 객체를 혼란하지 않는 별도의 오브젝트 / 테이블에 넣어.
이전 내 경력에서 나는 배송 주소를 참조하는 고객을 참조 주문을 가진 화가처럼 정규화. 이 "깨끗한"하지만 느리고 사용하기 우아 일을했다. 요즘 난 그냥 모든 주소 정보를 포함하는 순서 오브젝트를 사용합니다. 고객이 자신의 (? 기본값) 주소를 변경할 수 있으므로 사실이 더 자연스러운 생각하지만, 2007 년 출하량 전송의 주소는 항상 동일하게 유지한다 - 심지어 고객 이동의 경우 2008 년.
우리는 현재 사용되는 필드를 표준화 아웃 프로젝트에서 VerySimpleAddressProtocol를 구현합니다.
-
==============================
9.나는 첫 번째 옵션 갈 것입니다. 이러한 상황에서 나는 (당신이 그것을 필요로하지 않을 수 있습니다) YAGNI 매우 피곤 해요. 나는 일대 많은 세 "그냥 넣다"테이블을했다 중으로 스키마에 내가 검토 한 횟수를 셀 수 없다. 당신 만이 필요한 경우, 단지 첫 번째 옵션을 사용; 요구 사항은 향후 변경하는 경우, 다음을 변경합니다.
나는 첫 번째 옵션 갈 것입니다. 이러한 상황에서 나는 (당신이 그것을 필요로하지 않을 수 있습니다) YAGNI 매우 피곤 해요. 나는 일대 많은 세 "그냥 넣다"테이블을했다 중으로 스키마에 내가 검토 한 횟수를 셀 수 없다. 당신 만이 필요한 경우, 단지 첫 번째 옵션을 사용; 요구 사항은 향후 변경하는 경우, 다음을 변경합니다.
-
==============================
10.많은 경우에 좋아 : 그것은 의존한다.
많은 경우에 좋아 : 그것은 의존한다.
고객이 다음 여러 주소를 다루는 경우 일대 다 관계가 적절할 것이다. 당신은 주소 플래그를 소개합니다 수있는 주소가 배송 또는 청구서 등입니다 아니면 다른 테이블에있는 다른 주소 유형을 저장하고 고객에 대한 여러 대 일 관계가 신호를합니다.
당신은 단지 고객의 하나 개의 주소를 알 필요가 경우에 당신은 왜 그 일대를 모델링 할 것인가? A와 일대일 관계는 여기에 귀하의 요구를 충족합니다.
중요 : 성능 문제가 발생할 경우에만 비정규.
-
==============================
11.당신은, 당신도 주소 기록을 유지하기 위해 그것을 조금 수정할 수 있습니다하려면 내가 옵션을 1로 갈 것입니다 :
당신은, 당신도 주소 기록을 유지하기 위해 그것을 조금 수정할 수 있습니다하려면 내가 옵션을 1로 갈 것입니다 :
Customer (id, phys_address_id, mail_address_id) Address (id, customer_id, start_dt, end_dt, street, city, etc.)
주소가 변경되면, 단지 날짜를 현재 주소를 종료하고 주소 테이블에 새 레코드를 추가 할 수 있습니다. phys_address_id와 항상 mail_address_id 현재의 주소를 가리 킵니다.
당신이 주소의 역사를 유지할 수 그런 식으로, 당신은 (mail_address_id의 기본값) 데이터베이스에 저장된 여러 개의 메일 주소를 가질 수 있고, 물리적 주소와 우편 주소가 동일한 경우 당신은 동일한 레코드에서 phys_address_id 및 mail_address_id 포인트거야 .
-
==============================
12.좋은 스레드. 가장 적합한 스키마를 고민하는 동안은 소비하고 난 쿠엔틴-쳐다의 솔루션은 내가 그의 PersonAddress 테이블이 될 것입니다 무엇을 시작일과 종료일 필드를 추가 한 것을 제외하고 최고라고 결론을 내렸다. 또한 노트, 활성 및 삭제를 추가하기로 결정했습니다.
좋은 스레드. 가장 적합한 스키마를 고민하는 동안은 소비하고 난 쿠엔틴-쳐다의 솔루션은 내가 그의 PersonAddress 테이블이 될 것입니다 무엇을 시작일과 종료일 필드를 추가 한 것을 제외하고 최고라고 결론을 내렸다. 또한 노트, 활성 및 삭제를 추가하기로 결정했습니다.
나는 단순히 접합 테이블에서 레코드를 삭제하여 이전 주소의 추적을 잃고 싶지 않아 생각으로 삭제 소프트 삭제 기능입니다. 나는 매우 현명하다 생각하고 뭔가 다른 것이 좋습니다. 이 방법을 수행하지 않으면,이 주소 정보를 추적하려고 종이 또는 전자 문서의 개정에 남아있을 수있다 (뭔가 피해야).
노트는 내가 요구 사항의 무언가가되는 생각하지만, 그것은 단지 취향 수 있습니다. 나는 그것이 적어도 그 주소에 대한 메모를 기록 주소에서 개최 할 수 있도록에서 매우 유용하다 생각 (농촌 주소로) 나는 데이터베이스에 주소를 확인 백필 연습에 시간을 할애 한 일부 주소는 매우 모호 할 수있다.
내가 쿠엔틴-쳐다의 예에서 같은 이름의 표를 참조하여 다시 주소 테이블 (의 고유 색인입니다에 대한 의견을 듣고 싶습니다 한 가지. 당신은 복합 인덱스로 (가 고유 인덱스가 시행해야해야한다고 생각하십니까 아마도 전부가 아니다 널 / 필수 필드에서)?이 합리적인 것 같다하지만 여전히 우편으로 / 코드는 항상 하나의 속성에 고유하지 않은 압축에 관계없이 중복 데이터를 중지하기 어려울 수 있습니다. 국가, 지방 및 도시 필드가있는 경우에도 일치하지 않을 수 있습니다 주소 라인의 차이를 맞춤법 검사 (그들이 내 모델에) 참조 데이터로 채워집니다. 있는지 확인이 하나를 실행할 수 있습니다 최고의 피할 수있는 유일한 방법 또는 입력 양식 필드에서 DB 쿼리의 숫자 가능한 중복이 발견되었습니다. 자동으로 채 웁니다. 나는 이것이 당신이 단지 분별 될 수있는 경우가 될 것 같아 또 다른 안전 조치는 사용자에게 이미 그 사람과 사용에 연결된 데이터베이스에 주소에서 선택하는 옵션을 제공 할 것 및 PREC 받아 autions는 중복을 중지하지만 그냥 할 수있는 (그리고 아마도 것입니다) 조만간 일어날 동의합니다.
나를 위해이의 또 다른 중요한 측면은 주소 테이블 레코드의 미래 편집이다. 둘 다에 나열된 이명이 있다고 가정하자 : -
(11)간에 거리 무엇이든 도시 Z1P C0D3
하지 같은 주소 테이블 레코드를 다른 개체 (개인, 기업)에 할당 할 수 있도록 위험으로 간주해야 하는가? 그리고하자의 사용자가 111 무엇이든간에 거리에서 사람들의 삶 중 하나를 실현하고 오타가 말한다. 해당 주소를 변경하는 경우, 엔티티의 모두 변경됩니다. 나는 그것을 피하기 위해 싶습니다. 나의 제안은 MVC에서 모델을 가지고하는 것입니다 (내 경우에는, PHP Yii2) 새 주소가 고객에게 관련이있는 것으로 알려져 생성 될 때 주소 기록을 기존 모습 (주소 INNER SELECT * FROM는 personaddress ON personaddress.address_id 가입 = address.id WHERE personaddress.person_id = {현재 편집중인 사람 ID}) 상기 사용자에게 해당 레코드를 사용하는 대신 (본질적으로) 상기 제안 된 옵션을 제공한다.
나는 (비현실적) 주소 레코드의 편집 또는 기록의 편집 미래가 손상된 데이터 외부의 다른 엔티티와 관련된 수 있다는 위험 나중에 거부의 경우 수도로 자초되는 여러 다른 개체에 같은 주소를 연결하는 느낌 주소 기록의 하나는 편집되고있다.
나는 사람들의 생각을 듣고 싶어요.
from https://stackoverflow.com/questions/648463/best-way-to-model-customer-address by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 T-SQL의 형식 번호에 연결하여 숫자 및 문자열에? (0) | 2020.05.10 |
---|---|
[SQL] 임시 쿼리 동적 SQL [폐쇄] VS 프로 시저 VS (0) | 2020.05.10 |
[SQL] SQL의 다른 컬럼의 각 값에 대해 가장 일반적인 값을 가져옵니다 (0) | 2020.05.10 |
[SQL] 다른 테이블에 새로운 행의 값 삽입 SQL 서버 트리거 (0) | 2020.05.10 |
[SQL] 하나의 필드없이 entityframework에서 개체를 검색 (0) | 2020.05.10 |