2010-04-20 2 views
2

큰 주소 데이터베이스를 구성하는 것이 더 나은 방법은 무엇입니까?큰 주소 데이터베이스를 구성하는 것이 더 나은 방법은 무엇입니까?

주소의 mysql 데이터베이스를 생성해야합니다. 조직하는 것이 어떻게 더 좋은가? 나는 두 가지 변종이 : 나는 모든 만들기 주소를 사용 1) cuontries 단순화를 들어

id|name 
1 |Russia 

cities 
id|name 
1 |Moscow 
2 |Saratov 

villages 
id|name 

streets 
id|name 
1 |Lenin st. 

places 
id|name   |country_id|city_id|village_id|street_id|building_number|office|flat_number|room_number 
1 |somebuilding |1   |1  |NULL  |1  |31    |12a |NULL  |NULL 

합니다. 어떤 부분이 주소에 참여하지 않는 경우는 동일 NULL

2)

addressElements 
id|name 
1 |country 
2 |city 
3 |village 
4 |street 
5 |office 
6 |flat_number 
7 |room_number 

addressValues 
id|addressElement_id|value 
1 |1    |Russia 
2 |2    |Saratov 
3 |2    |Moscow 
4 |3    |Prostokvashino 
5 |4    |Lenin st. 

places 
id| name 
1 | somebuilding 

places_has_addressValues 
place_id|addressValue_id 
1  |1 
1  |3 
1  |5 

UPD입니다. 나는 다음과 같이 결정했다. alt text http://notme.ru/bebe/addresses.jpg

나는 개체의 유형을 선언하기 위해 "type"속성 (ENUM)을 사용한다. 예를 들어, 아파트 유형은 '평면'또는 '방'또는 '사무실'일 수 있습니다.

+0

나는 마을을 제거한다. –

+0

도시와 마을이 null이 아니면 도시에서 마을 수 있습니다 – shurik2533

답변

2

내가 첫 번째 옵션을 선택 줄 이유 :

  • 단순성. 첫 번째 옵션은 약 12 ​​배 더 명확하고 분명합니다. 나중에 다른 사람들이 귀하의 코드를 관리 할 수 ​​있다고 생각하십시오.
  • 조인. Vanessa가 언급했듯이 두 번째 옵션을 사용하면 조인을 작성하는 것이 훨씬 어려워집니다.

첫 번째 옵션의 단점은 더 엄격한 구조 일 가능성이 높으므로 데이터 모델에 맞는 모든 옵션 (예 : 사서함이란 무엇입니까?)을 확보하기 위해 시간을 투자해야합니다. 현지 우체국을 방문하고 채팅하고 싶을 수도 있습니다. 어쩌면 http://www.russianpost.ru/에 유용한 정보가 있습니까?

1

첫 번째 아파트와 같이 말해야합니다. 장소는 한 국가, 한 도시 (또는 아마도 도시 없음), 한 마을 (또는 마을이 없을 수도 있음) 등입니다. 두 번째 데이터베이스는 여러 국가, 여러 도로 등에서 장소를 가질 수있는 유연성을 제공합니다. 그러나 주소에 대해 아무런 의미가 없으므로 불필요한 복잡성 계층을 추가하기 만하면 주소를 조회 할 때마다 더 많은 결합이 이루어집니다.

1

두 번째 옵션은 성능 저하 요인이 될 수 있습니다. EAV 테이블은 커서가있는 곳에서 수행하지 마십시오. 또한 특정 주소에 몇 개의 요소가 있는지 알지 못하기 때문에 주소를 얻기 위해 쿼리하는 것이 어려울 것입니다.

어떻게 사용 하시겠습니까? 당신은 정말로 사람들이 가능한 모든 거리 주소를보고 기록에 맞는 것을 선택하게 할 것입니까? 단순히 주소를 입력하지 않았습니까? 대량 가져 오기가 아닌 GUI에서 데이터 입력을 수행하려는 경우 거리 표를 사용하지 않습니다. 나는 도시 테이블에 대해 같은 방식으로 느낀다. 얼마나 많은 출품작이있을 것인가? 그 나라를 위해 존재해야만하는 도시들을 지키는 것이 좋지만, 데이터를 입력 할 때 실용적입니까? 도시 테이블에없는 도시에 누군가 들어가야 할 때 당신은 무엇을합니까? 인용문은 때때로 이름을 변경하며 데이터 항목은 도시 테이블에 아직 입력하지 않은 최신 값을 가질 수 있습니다.

+0

또한 정규화는 데이터를 얼마나 자주 다시 사용할 것인지 고려해야합니다. 번지를 정상화하면 재사용 율이 매우 낮습니다. 반대로 도시, 국가 등에 대한 재사용 율은 훨씬 높을 것으로 예상되지만, 다른 테이블, 인덱스, 추가 조인 등으로 인해 얼마나 많은 공간을 절약 할 수 있습니까? 두 테이블간에 대략 1 : 1 상관 관계가있는 경우, 그들은 합병 될 필요가있다. – GalacticCowboy

0

1) 마을과 도시는 동등합니다 (예 : 도시 또는 마을이지만 둘 다 동일하지는 않음).

2) 적절하게 표준화 된 DB는 것 : 당신이 도시에서 마을 수없는

table countries 
    (country_id int primary key, country_name varchar(100)); 

table cities # also villages 
    (city_id int primary key, city_country_id int, city_name varchar(200), 
    city_is_village bool); 

table streets 
    (street_id int primary key, street_city_id int, street_name varchar(200)); 

table addresses # we'll stop normalizing here 
    (addr_id int primary key, addr_street_id int, addr_building_number int, 
    addr_office int, addr_flat_number int, addr_room_number int); 

# then to get the entire address, you would join the tables 

SELECT addr_room_number, addr_flat_number, addr_office, addr_building_number, 
     street_name, city_name, city_is_village, country_name 
    FROM addresses 
    LEFT join streets ON street_id = addr_street_id 
    LEFT join cities ON city_id = street_city_id 
    LEFT join countries ON country_id = city_country_id 
    ; 
관련 문제