2014-01-12 1 views
3

Я создаю структуру базы данных электронной коммерции с движком Mysql и INNODB.Дизайн базы данных Mysql для нескольких адресов клиентов и по умолчанию

Пункт 1: Для того, чтобы создать несколько адресов для клиентов у меня есть эти таблицы

Может ли я делать это в правильном пути? И как мне сохранить адрес по умолчанию (в какой таблице)?

Пункт 2: У меня есть другая таблица под названием «Поставщики», если я просто подключу ее к адресам с помощью таблицы «поставщик_адрес» или есть лучший способ?

Пункт 3: А как насчет таблиц городов и стран? Должен ли я добавить что-то или это нормально? Может быть, поле «район» в другом столе между ними?

ответ

4

По моему мнению, вы слишком усложняетесь. Нет необходимости делать так, чтобы ваша схема адресов была слишком нормализована. Большинство систем, которые я видел, что обрабатывать несколько адресов клиентов есть таблица клиентов, как у вас, а затем таблицу адресов следующим образом:

customer_id 
address_ordinal (small number for each customer: 0,1,2,3 etc). 
primary (boolean) 
address_1 
address_2 
locality (city, village, etc) 
province (state, etc) 
postcode (zip, postcode etc) 
country 

customer_id является внешним ключом к customer таблице. Первичный ключ представляет собой композицию (customer_id, address_ordinal). Столбец primary равен true, если адрес является основным.

Что касается вашего вопроса о поставщиках, вы можете создать общую таблицу под названием «контакты» и предоставить своим клиентам и поставщикам contact_ids.

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

+0

Для чего вы вставляете поле address_ordinal? И что, если адреса находятся в разных городах, может быть, в разных провинциях и имеют разные почтовые индексы? – Manuel

+0

Возможно, что некоторые адреса имеют две линии (например, 1120 Park Avenue/Apartment 102). Вот почему есть столбцы 'address_1' и' address_2'. Если конкретный customer_id имеет только один адрес, порядковый номер равен 0. Если вы добавите другой, порядковый номер будет равен 1 и т. Д. –

0

Я начну свой ответ с помощью оле-клише: «Существует более одного способа кошки кошки». Тем не менее, у меня есть несколько предложений:

Пункт 1 - Предполагая, что клиент может иметь несколько адресов (то есть биллинг и рассылка), то да, у вас есть правильная идея с точки зрения отдельной таблицы сопоставления. Что касается добавления поля к customer_addresses по умолчанию или предпочтительно, или что-то в этом роде, это не плохая идея, но еще один вариант - добавить новое поле, называемое address_type, которое будет ссылаться на отдельную таблицу с двумя записями: «Billing» и «Mailing »и/или все, что вы захотите. Затем в любом приложении, которое вы кодируете, которое будет использовать данные адреса, в зависимости от того, какой контекст, то есть, если вы находитесь на странице информации о выставлении счетов, затем укажите код адреса, который вы используете на самой странице, например SELECT * FROM customer_addresses WHERE address_type = 2 /* Billing */.

Пункт 2 - То же, что и для клиентов.

Пункт 3 - Вы хотите иметь возможность отображать сокращенные названия стран? Например, сократите «Соединенные Штаты» до «США», «Канада» до «CAN» или «Соединенное Королевство» до «Великобритании»? Я бы подумал о добавлении поля для сокращенных названий стран для этой цели.

+0

Спасибо!Некоторые вопросы: в пункте 1, если клиенты хотят изменить адрес по умолчанию, я должен затем изменить это поле, но что, если при этом возникает ошибка? Например, у меня будет пользователь без адреса по умолчанию? Я думаю, что это противоречиво, возможно, было бы лучше добавить это поле в таблицу клиентов? – Manuel

+0

Возможно, подумав об этом, второй вариант, который вы сказали, лучше, поэтому пользователь может сохранить один адр для выставления счетов и один для отправки;) Я также хочу добавить, например, тип 3, который указывает адрес, добавленный клиентом, который на самом деле isn ' t используется для выставления счетов или доставки! что ты думаешь об этом? – Manuel

Смежные вопросы