Php 具有限制装运区域的项目的数据库设计

Php 具有限制装运区域的项目的数据库设计,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我正在为一个购物车设计数据库,我很难决定如何解决这个问题 项目可以限制为三个层次: 1) 仅限本地配送 2) 可送货 a) 国家 b) 陈述 c) 区域 我想采用这样的结构: 产品装运限制- 键(int)、产品ID(int)、仅本地(enum('y','n')、国家(enum('y','n')、州(enum('y','n'))、地区(enum('y','n')) 然后,如果其中任何一个有标志,请检查相应的表,例如 product\u shipto\u states-key(int)、produc

我正在为一个购物车设计数据库,我很难决定如何解决这个问题

项目可以限制为三个层次:

1) 仅限本地配送

2) 可送货 a) 国家 b) 陈述 c) 区域

我想采用这样的结构:

产品装运限制-
键(int)、产品ID(int)、仅本地(enum('y','n')、国家(enum('y','n')、州(enum('y','n'))、地区(enum('y','n'))

然后,如果其中任何一个有标志,请检查相应的表,例如

product\u shipto\u states-key(int)、productId(int)、stateId(int)

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

产品装运限制-空,10,'n','y','y','n'

产品交付至国家/地区
-空,10,AU

产品交付至国家
-空、10、1和空、10、2

你们能想出更好的方法来达到这个效果吗


请注意,很抱歉设置了格式!

您可以在products\u shipto\u countries和product\u shipto\u states表中有特殊的行来显示“any”或“all”或“none”,这样您就不必担心是否要检查这些表;您可以一直这样做。这样可以减少代码的路径,而代价可能是取消检查必要的阅读


另外一个问题是,如何决定您可以将产品运送到除某些国家/地区、州等以外的任何地方。您是想列出所有可能性还是希望表中有“not”行?

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

属性,属性,值,其中属性是国家代码

产品、国家、州

新南威尔士州非盟10号 昆士兰州澳10号 10、我们所有人


不完全确定它如何处理区域,除非州可以以某种方式变得唯一。

使用允许目的地表可能会有所帮助,而不是专注于限制。 地理位置表列出了可能运送到的所有可能目的地。允许运送表定义了每个产品的允许目的地。请注意,“仅本地”一词有点模棱两可——本地给谁


是的,我想没有行,但大多数产品可能只在其原产国内发货,如果我们添加更多的国家,没有行可能会超过其他行。肯定需要包括地区,可能会变得非常混乱,因为每个州可能有10-20个地区。但看看EAV…嗨,Damir,谢谢这一点,我认为我们正在接近。Local是产品的本地,比如说10公里半径(将在网站上适当解释)我喜欢您的allow shipping表,但是您认为拥有GeographyId(PK)、GeographyType(CHAR(1))、ParentId(INT)等地理表怎么样这样我就可以将它们链接到现有的国家、州和地区的表格中?当然,这也会起作用,尽管它是非标准化的(一个表格)加快查找速度。这取决于模型的其他部分。地理只是一个查找,还是使用其他类型的地理数据?对于查找,一个表很好——如果对地理感知应用感兴趣,另一种方法听起来更好。是的,模型已经是这样构建的。非常感谢你的帮助Damir,你是一个传奇。
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)
;