Как разработать схему базы данных, представляющей АДРЕС элегантно? - PullRequest
4 голосов
/ 24 мая 2011

под адресом я подразумеваю только обычный адрес, такой как страна, штат, город, район, улица, здание,

, где на адрес можно эффективно ссылаться в других таблицах, например на людей, чтобы мы могли выбирать людей втот же город или так далее?Спасибо.

Ответы [ 3 ]

5 голосов
/ 24 мая 2011

По моему опыту, вам нужна страна, штат, город, почтовый индекс, адрес.

Только первые три / четыре удобны для фильтрации пользователей. Enum поля очень подходят для первых двух. Следующие два идеально проверены с использованием API - это избавит вас от необходимости вести список допустимых значений.

Мне еще не приходилось сталкиваться с какой-либо системой (хотя я предполагаю, что она потребуется почтовому отделению наряду с геолокацией), для которой часть адреса должна быть разбита на отдельные фрагменты данных для более точной фильтрации - плюс каждый пользователь имеет свой собственный способ войти в последний.

Имейте в виду, что в некоторых странах нет государства; что у других нет почтовых индексов; и что форматы почтовых индексов сильно различаются в разных странах.

Также имейте в виду, что даже когда у пользователя может быть несколько адресов в вашей системе, последнее, что вам нужно, это привязать нескольких пользователей к одному и тому же address_id. Обычно их лучше размещать в качестве сведений о пользователях (или их компании) или в качестве деталей, относящихся к 1-n; никогда н-н. Когда нет, проблемы с пользовательским интерфейсом быстро закрадываются, и кто-то неизменно по ошибке редактирует адрес пользователя B, потому что последний случайно делится им с пользователем A.

4 голосов
/ 24 мая 2011

Вот одна расширенная структура базы данных для представления адресов,
Преимущества этого подхода
1. Позже вы можете добавить город, страну, штат.
2. поддерживает редактирование страны или штата города.
3. Город сопоставляется со штатом, а штат сопоставляется со страной.Таким образом, вы просто будете хранить город в адресе.Вам не нужно хранить штат и страну в каждом адресе, что сокращает избыточность.
4. Вы можете создавать список штатов, когда пользователь выбирает страну.Аналогично, вы можете создать список городов, когда пользователь выбирает штат.

Address
   id            INT        PK    AUTO_INCREMENT
   street        VARCHAR    
   city_fk       INT        FK    
   Zip_code      VARCHAR
City
   id            INT        PK    AUTO_INCREMENT
   name          VARCHAR
   state_fk      INT        FK
State
   id            INT        PK    AUTO_INCREMENT
   name          VARCHAR
   country_fk    INT        Fk
Country
   id            INT        PK    AUTO_INCREMENT
   name          VARCHAR

user
   id            INT        PK    AUTO_INCREMENT
   # other details
user_address_mapping                              # So that user can have multiple address
   id            INT        PK    AUTO_INCREMENT
   user_fk       INT        FK                    # Link to user
   address_fk    INT        FK                    # Foreign key to address

РЕДАКТИРОВАТЬ: (благодаря комментарию @Denis)
Или Если в вашей стране нет состояний (Или вы хотите общее решение) вот структура.

Address
   id            INT        PK    AUTO_INCREMENT
   street        VARCHAR    
   city_fk       INT        FK    
   state_fk      INT        FK
   country_fk    INT        FK
   Zip_code      VARCHAR
City
   id            INT        PK    AUTO_INCREMENT
   name          VARCHAR
State
   id            INT        PK    AUTO_INCREMENT
   name          VARCHAR
Country
   id            INT        PK    AUTO_INCREMENT
   name          VARCHAR

user
   id            INT        PK    AUTO_INCREMENT
   # other details
user_address_mapping                              # So that user can have multiple address
   id            INT        PK    AUTO_INCREMENT
   user_fk       INT        FK                    # Link to user
   address_fk    INT        FK                    # Foreign key to address
   # Here user_fk & address_fk should be composite unique key, so that users can not share an address.
2 голосов
/ 24 мая 2011

Хорошо зависит от того, как вы хотите нормализовать дб, (склад или транзакции)

Пример 1: ненормализовано, все в одной таблице

имя таблицы: пользователь

атрибут: идентификатор пользователя, имя пользователя, страна

sql для извлечения:

 select username from user where country="USA"

Пример 2: нормализовано, все в отдельной таблице

имя таблицы: атрибут пользователя: идентификатор пользователя, пользовательимя, идентификатор страны

имя таблицы: атрибут страны: идентификатор страны, название страны

sql для получения:

 select username from user inner join country where country="USA"

Вам необходимо знать, для чего используется БД для определения«эффективный» способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...