【问题标题】:Database design for items that have restricted shipping regions限制运输区域的项目的数据库设计
【发布时间】:2010-07-12 09:59:14
【问题描述】:

我正在为购物车设计数据库,但我无法决定采用哪种方法来解决这个问题。

物品可以被限制在三个等级:

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

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

附:抱歉格式化!

【问题讨论】:

    标签: php mysql database database-design


    【解决方案1】:

    使用允许的目的地表而不是关注限制可能会有所帮助。 geography 表列出了一个人可能运送到的所有可能目的地。 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)
    ;
    

    【讨论】:

    • 嗨,Damir,谢谢你,我想我们已经接近了。本地是产品的本地,例如 10 公里半径(将在网站上正确解释)我喜欢您的允许运输表,但您如何看待地理表,如 GeographyId(PK)、GeographyType(CHAR(1))、ParentId (INT) 以便我可以将它们链接到现有的国家、州和地区表?
    • 当然,这也可以,尽管将其反规范化(一个表)会加快查找速度。取决于模型的其余部分。地理只是查找还是您使用其他类型的地理数据?对于查找,一个表很好 - 如果对地理感知应用感兴趣,另一种方法听起来更好。
    • 是的,模型已经这样构建了。非常感谢您的帮助 Damir,您是传奇人物。
    【解决方案2】:

    您可以在 products_shipto_countries 和 product_shipto_states 表中设置特殊行来显示“任何”或“全部”或“无”,然后您不必担心是否检查这些表;你会一直这样做。这样会留下更少的代码路径,但可能会以不必要的读取为代价。

    另一个问题是如何决定您可以将产品运送到除某些国家、州等以外的任何地方。您是要列出所有可能性还是在表格中包含“不”行?

    【讨论】:

    • 是的,我考虑过没有行,但大多数产品可能只会在其原产国境内发货,如果我们添加更多国家/地区,则 not 行可能会超过其他行。
    【解决方案3】:

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

    实体、属性、值,其中属性为国家代码

    产品、国家、州

    10,澳大利亚,新南威尔士州 10、澳大利亚、昆士兰 10,美国,所有

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

    【讨论】:

    • 绝对需要包括区域,并且可能会变得非常混乱,因为每个州可能有 10-20 个区域。虽然调查 EAV...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多