我有数据库结构的设计问题。 我们的目标是为每个地理区域的客户提供优惠数据库。 每个优惠都可以在很多地区提供。
这些地区处于分层状态 - 例如:
subregion_1
subregion_11
region_111
region_112
subregion_12
region_121
region_122
subregion_2
subregion_21
region_221
现在我想在数据库中存储offer_1和该优惠的区域。我将给你3个例子,我必须得到啊:
此外,我必须提供一种方法,以动态和非常快的速度计算每个地区的不同报价数量。 有人建议如何接受这种设计吗?
这就是我的目标。
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区域的报价的问题。
答案 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)您可能对此感兴趣调查一下。每个在选择/插入/删除性能方面都有不同的优缺点
修改强>
我刚刚注意到您编辑了您的问题,而且该优惠可能属于多个地区。以上可能需要进行调整以支持分配多个区域,但仍可以应用基本思想。