0

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

这些区域处于层次结构中 - 例如:

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
  • 当我的 offer_1 存储在 subregion_1 中时,offer 将显示在 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 区域。使用这种设计,我遇到了如何查询每个区域的不同报价数量以及如何查询 1 级、2 级区域的报价的问题和三级地区。

4

1 回答 1

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)
);

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

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

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/%'

还有其他模式可以为您的分层数据建模,例如嵌套集闭包表可能相关),您可能也有兴趣研究它们。每个在选择/插入/删除性能方面都有不同的优缺点

编辑:

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

于 2011-12-02T21:28:55.827 回答