2010-04-20 4 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

Я использую свойство «тип» (ENUM) для объявления типа объекта. Например, тип квартиры может быть «плоским» или «комнатой» или «офисом»

+0

Я бы избавиться от деревни, если вы можете деревни в город. –

+0

Если город и деревня не являются нулевыми, я могу поселить деревню – shurik2533

ответ

2

Причины, почему я бы выбрал первый вариант:

  • Простота. Первый вариант примерно в десять раз более ясный и очевидный. Подумайте о других людях, поддерживающих ваш код позже.
  • Соединения. Как упомянула Ванесса, сочинять союзы было бы намного сложнее со вторым вариантом.

Недостатком первого варианта является, вероятно, более жесткая структура, поэтому вам нужно потратить некоторое время, чтобы убедиться, что у вас есть все возможные варианты, подходящие для вашей модели данных (например, что касается поля P.O.?). Возможно, вы захотите посетить свое местное почтовое отделение и пообщаться. Может быть, у http://www.russianpost.ru/ была бы какая-нибудь полезная информация?

1

Я бы сказал, идите первым. Место находится в одной стране, одном городе (или, возможно, нет города), одной деревне (или, возможно, ни одной деревне) и т. Д. Вторая база данных даст вам гибкость, чтобы иметь место в нескольких странах, на нескольких улицах и т. Д. Но поскольку это не имеет никакого смысла для адресов, оно просто добавляет ненужный уровень сложности и больше присоединяется каждый раз, когда вы хотите найти адрес.

1

Второй вариант будет убийцей производительности, не делайте этого (таблицы EAV высоки в моем списке DO NOT DO прямо там с курсорами). Также будет сложно запросить адрес, поскольку вы не знаете, сколько элементов имеет конкретный адрес.

Как вы собираетесь это использовать? Вы действительно собираетесь заставить людей искать все возможные уличные адреса, чтобы выбрать правильный для записи? Почему бы просто не ввести их в адрес? Я бы не использовал таблицу улиц, если вы собираетесь делать ввод данных из графического интерфейса, а не для массового импорта. Я как-то так же отношусь к таблице городов, сколько записей у нее будет? Приятно пытаться держаться в городах, которые должны существовать для этой страны, но насколько практично при вводе данных? Что вы делаете, когда кому-то нужно войти в город, который не находится в таблице городов? Cites иногда меняют имена, и запись данных может иметь более новое значение, которое еще не попало в таблицу городов.

+0

Кроме того, при нормализации следует учитывать, как часто данные будут повторно использоваться. Если вы нормализуете уличный адрес, у вас будет очень низкая частота повторного использования. И наоборот, вы ожидаете, что у вас будет гораздо больше ставок повторного использования для города, страны и т. Д. Но сколько места вы хотите сохранить, кроме наличия другой таблицы, индексов, дополнительных объединений и т. Д. Если у вас примерно 1: 1 корреляция между двумя таблицами, они должны быть объединены. – GalacticCowboy

0

1) Деревня и город эквивалентны - то есть, город или деревня, но не оба.

2) Правильно нормированная дб бы:

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 
    ; 
Смежные вопросы