我正在为购物车设计数据库,我无法确定解决此问题的方法。
有三个层可以限制项目:
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。对不起格式化!
答案 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 表定义了每个产品的允许目标。请注意,术语“仅限本地”有点含糊不清 - 本地对谁?
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)
;