具有受限制的运输区域的项目的数据库设计

时间:2010-07-12 09:59:15

标签: php mysql database database-design

我正在为购物车设计数据库,我无法确定解决此问题的方法。

有三个层可以限制项目:

1)仅限本地送货

2)可以运送     一个国家     b)国家     c)区域

我正在考虑采用这样的结构:

  

product_shipping_restrictions - key(int), productId(int), local_only(enum('y', 'n'), countries(enum('y', 'n'), states(enum('y', 'n'), regions(enum('y', 'n')

然后,如果有任何标志,请检查相应的表格,例如

  

product_shipto_states - key(int), productId(int), stateId(int)

因此,例如,如果产品10仅限于运往澳大利亚以及新南威尔士州和昆士兰州,我们将拥有:

  

product_shipping_restrictions - NULL, 10, 'n', 'y', 'y', 'n'

  

product_shipto_countries - NULL,10,AU

     

product_shipto_states - NULL,10,1和& NULL,10,2

你们能想出一个更好的方法来实现这个结果吗?

P.S。对不起格式化!

3 个答案:

答案 0 :(得分:0)

您可以在products_shipto_countries和product_shipto_states表中使用特殊行来显示“any”或“all”或“none”,然后您不必担心是否检查这些表;你会一直这样做。这会留下更少的代码路径,代价是不必要的读取。

另一个问题是如何确定您可以将产品运送到除某些国家/地区,州等之外的任何地方。您是否要列出所有可能性或在表格中有“不”行?

答案 1 :(得分:0)

也许这是EAV表可能有用的情况之一。

Enitity,Attribute,Value其中Attribute是国家/地区的代码

产品,国家,州

10,AU,NSW 10,AU,QLD 10,US,ALL

不完全确定它如何处理区域,除非可以某种方式使国家变得独特。

答案 2 :(得分:0)

使用允许的目的地表可能会有所帮助,而不是关注限制。 地理位置表列出了可能发送到的所有可能目的地。 allow_shipping 表定义了每个产品的允许目标。请注意,术语“仅限本地”有点含糊不清 - 本地对谁?

product_ship_model

create table product (
      ProductId   integer not null
    , ProductName varchar(128)
);
alter table product add CONSTRAINT pk_product PRIMARY KEY (ProductId);


create table geography (
      GeographyId integer not null
    , Country     varchar(50)
    , State       varchar(50)
    , Region      varchar(50)
);
alter table geography add CONSTRAINT pk_geography PRIMARY KEY (GeographyId);


create table allow_shipping (
      ProductId   integer not null
    , GeographyId integer not null 
    , Allowed     enum('y','n')
);
alter table allow_shipping 
    add CONSTRAINT pk_allowshipping  PRIMARY KEY (ProductId, GeographyId)
  , add CONSTRAINT fk1_allowshipping FOREIGN KEY (ProductId)   REFERENCES product   (ProductId)
  , add CONSTRAINT fk2_allowshipping FOREIGN KEY (GeographyId) REFERENCES geography (GeographyId)
;