数据库设计 - 项目和区域

时间:2011-12-02 20:44:30

标签: hierarchical-data regions database-design

我有数据库结构的设计问题。 我们的目标是为每个地理区域的客户提供优惠数据库。 每个优惠都可以在很多地区提供。

这些地区处于分层状态 - 例如:

subregion_1
  subregion_11
    region_111
    region_112
  subregion_12
    region_121
    region_122
subregion_2
  subregion_21
    region_221

现在我想在数据库中存储offer_1和该优惠的区域。我将给你3个例子,我必须得到啊:

  • 当我的offer_1存储在region_111中时,我想在用户浏览subregion_1,subregion_11和region_111
  • 时显示此优惠
  • 如果offer_1存储在subregion_11和region_121区域,那么当用户浏览subregion_1,subregion_11以及subregion_11,subregion_12和region_121
  • 的所有分支时,应显示该优惠。
  • 当我的offer_1存储在subregion_1中时,优惠显示在subregion_1页面上,所有分支显示在subregion_1下。

此外,我必须提供一种方法,以动态和非常快的速度计算每个地区的不同报价数量。 有人建议如何接受这种设计吗?

这就是我的目标。

Regions
------------------------------------------------------------
| id     | level1 | level2 | level3 | name         | level |
------------------------------------------------------------
| 02     | 02     | null   | null   | subregion_1  | 1     |
| 0201   | 02     | 01     | null   | subregion_11 | 2     |
| 020103 | 02     | 01     | 03     | region_111   | 3     |
------------------------------------------------------------

Offers to regions
------------------------
| offer_id | region_id |
------------------------
| 1        | 020103    |
| 1        | 0202      |
------------------------

我通过连接level1,level2和level3为区域创建了id。在表Offers_to_regions中,我存储了要约和区域。在这里,我有3级(020103)的区域和2级(0202)的区域1。 通过这种设计,我遇到了如何查询每个区域的不同报价数量以及如何查询level1,level2和level3区域的报价的问题。

1 个答案:

答案 0 :(得分:1)

有一种明显的方法,它使用id指向像这样的父

CREATE TABLE Regions (
    region_id INT AUTO_INCREMENT PRIMARY KEY,
    parent_id INT,
    region_name VARCHAR(100) NOT NULL,
    FOREIGN KEY (parent_id) REFERENCES Regions(region_id)
);

但在你的情况下,这可以被认为是反模式,因为通过层次结构查询并不是那么容易(特别是如果级别的数量发生变化)

另一种方法可能是使用路径枚举之类的东西,您可以在其中存储类似于例如unix路径的层次结构路径。 E.g。

CREATE TABLE Regions (
    region_id INT AUTO_INCREMENT PRIMARY KEY,
    path VARCHAR(100),
    region_name VARCHAR(100) NOT NULL
);

这将允许您像这样存储您的层次结构

---------------------------------------------
| region_id | path       | region_name      |
---------------------------------------------
| 1         | 1/         | subregion_1      |
| 2         | 1/2/       | subregion_11     |
| 3         | 1/2/3/     | region_111       |
| 4         | 1/2/4/     | region_112       |
---------------------------------------------

这样,在查询商品表时(每个商品都会有一个引用到region_id的地方),而浏览时可以说subregion_1(ID为1),你的查询可能看起来像这样。

select Offers.SOME_COLUMN, ......
from Offers, Regions
where Offers.region_id = Regions.region_id
and   Regions.path like '1/%'

还有其他模式可以为您的分层数据建模,例如 Nested Sets 关闭表maybe relevant)您可能对此感兴趣调查一下。每个在选择/插入/删除性能方面都有不同的优缺点

修改

我刚刚注意到您编辑了您的问题,而且该优惠可能属于多个地区。以上可能需要进行调整以支持分配多个区域,但仍可以应用基本思想。