具有任何层次结构的SQL-Association表

时间:2018-01-31 05:21:41

标签: sql postgresql

我有一个product表,其中包含以下架构

     Column     |           Type           |
----------------+--------------------------+
 id             | integer                  |
 name           | character varying(255)   |

和带有架构的location

       Column     |           Type           |
  ----------------+--------------------------+
   id             | integer                  |
   country        | character varying(255)   |
   state          | character varying(255)   |
   region         | character varying(255)   |
   city           | character varying(255)   |

我需要在两个表之间建立多对多关系,并且product可以与location表中的任何级别的位置相关联。例如,产品可以在整个国家或特定地区或城市销售。

如果用户在国家/地区级别选择位置,我可以为映射表中的所有位置创建条目(例如,如果用户选择国家/地区,可以在映射表中为美国所有城市创建条目),但这会创建大量的映射行。

以我可以选择任何级别的位置的方式映射两个表最好的是什么?

1 个答案:

答案 0 :(得分:0)

在第三个表格中,您也可以指定级别。因此,您的第三个表格可以说product_location将具有以下提到的字段:

product_id
location_name
location_level

location_level可以包含国家,州,地区,城市等值

例如,您的数据可能如下所示:

product_id     location_name     location_level
    1             India               Country
    2             New Delhi           City
    3             North Asia          Region

现在选择时您可以使用以下查询:

select loc.*,prod.* from location loc, product prod, product_location prodLoc where prodLoc.location_name ='India' and prodLoc.product_id = prod.id and 
case when prodLoc.location_level ='Country' and loc.country= prodLoc.location_name then 'Y'
when prodLoc.location_level ='City' and loc.city= prodLoc.location_name then 'Y'
when prodLoc.location_level ='Region' and loc.region= prodLoc.location_name then 'Y'
else 'N' end ='Y';

P.S:此解决方案是根据您提供的表格设计提供的