Как лучше организовать большую базу адресов? - PullRequest
2 голосов
/ 20 апреля 2010

Как лучше организовать большую базу адресов?

Необходимо создать базу данных адресов 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. Я решил сделать следующее альтернативный текст http://notme.ru/bebe/addresses.jpg

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

Ответы [ 4 ]

2 голосов
/ 20 апреля 2010

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

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

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

1 голос
/ 20 апреля 2010

Вторым вариантом будет снижение производительности, не делайте этого (таблицы EAV находятся в начале моего списка НЕ ​​ДЕЛАТЬ прямо с курсорами). Также будет сложно запросить адрес, так как вы не знаете, сколько элементов имеет конкретный адрес.

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

1 голос
/ 20 апреля 2010

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

0 голосов
/ 20 апреля 2010

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
    ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...