Сохранение стоимости доставки в таблице MySQL, где в будущем будет добавлено много столбцов. - PullRequest
2 голосов
/ 18 октября 2011

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

Моя первая мысль примерно такая:

id      from_weight to_weight   price   us  ca  gb  fr  es  de  it
------------------------------------------------------------------
1       0g          499g        1.99    Y   Y   N   N   N   N   N
2       500g        999g        2.99    Y   Y   N   N   N   N   N
3       1000g       1999g       4.99    Y   Y   N   N   N   N   N
4       2000g       2999g       7.99    Y   Y   N   N   N   N   N
5       0g          499g        4.99    N   N   Y   Y   Y   Y   Y
6       500g        999g        6.99    N   N   Y   Y   Y   Y   Y
7       1000g       1999g       9.99    N   N   Y   Y   Y   Y   Y
8       2000g       2999g       14.99   N   N   Y   Y   Y   Y   Y

Однако планируется добавить все больше и больше страновых опций. Это будет означать добавление большего количества столбцов каждый раз. Это лучший способ структурировать данные такого рода. Любые другие предложения

Ответы [ 4 ]

4 голосов
/ 18 октября 2011

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

Я бы посоветовал при поиске «3-й нормальной формы», если ваша база данных соответствует правилам, чтобы быть в 3-й нормальной форме, тогда вы обычно заканчиваетес гораздо меньшими затратами на техническое обслуживание и более легкой расширяемостью.

table1
id | from_weight | to_weight | price   
1  | 0g          | 499g      | 1.99

table2
id | table1id | countrycode | status
1  | 1        | us          | Y
2  | 1        | ca          | Y
3  | 1        | gb          | N

это то, как вы бы запрашивали данные

select price from table1 
join table2 on table1.id=table2.table1id
where countrycode='us' and status='Y' and
300 between from_weight and to_weight
0 голосов
/ 18 октября 2011

Кажется, строки вашей таблицы образуют группы связанных тарифных планов.Если это так, я бы предложил вам таблицу PricingPlan и таблицу PlanDetail.

PricingPlan
-----------
PricingPlanId* PlanTitle
----------------------------------------
 1              planA for North America
 2              planB for EU

PlanDetail
----------
PricingPlanId* DetailId* FromWeight  ToWeight  Price
------------------------------------------------------
 1              1            0g        499g      1.99   
 1              2          500g        999g      2.99   
 1              3         1000g       1999g      4.99  
 1              4         2000g       2999g      7.99   
 2              1            0g        499g      4.99   
 2              2          500g        999g      6.99   
 2              3         1000g       1999g      9.99   
 2              4         2000g       2999g     14.99  

Следует использовать третью таблицу PlanCountry, чтобы вам не приходилось добавлять столбцы для новых стран, которые вы хотите связать с тарифным планом (в эту таблицу добавится новая строка, например, если вы хотите, чтобы Мексика была включена в план А):

Country
-------
CountryCode* CountryName
-----------------------------
 us           USA
 ca           Canada
 uk           United Kingdom
 fr           France
 es           Spain
 de           Germany
 it           Italy

PlanCountry
-----------
PricingPlanId* CountryCode*
---------------------------
 1               us
 1               ca
 2               uk
 2               fr
 2               es
 2               de
 2               it
 1               mx                   --- Mexico added for planA
0 голосов
/ 18 октября 2011

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

SELECT price FROM table WHERE $weight > from_weight AND $weight < to_weight AND $country;

И ваша схема позволяет это легко.Я бы порекомендовал вам выбрать свой to_weight так, чтобы значение 499,9 соответствовало одной из категорий, если вес не ограничен целым числом.Я не буду беспокоиться о добавлении новых столбцов, это просто, и вы можете по умолчанию установить значение false для любой новой страны.

0 голосов
/ 18 октября 2011

Если вы хотите избежать добавления столбцов, вы можете добавить вторую таблицу, в которой столбцы priceID и Country представлены в виде столбцов, и просто удалить все столбцы страны. Затем вы просто указываете, что priceID имеет внешний ключ, ссылающийся на идентификатор из вашей первой таблицы, и вы можете добавлять новые страны по мере необходимости.

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