Noob需要在postgresql DB

时间:2017-09-25 23:08:38

标签: sql postgresql database-design

我在使用数据库方面经验很少(我只知道绝对的基础知识)。有了这个说明,我想我的问题很容易解决更有经验的头脑。

我的问题是:

我需要一种能够搜索“所有类型的铝及其所有子材料”的方法吗?

我可以做简单的查询,比如

SELECT * 
FROM sub_materials 
WHERE category_id = 2;

所以我要求的基本上是能够看到铝的整个分支。我已经看过ltreeClosure Tables了但是我很想要一个Noob来解决这个问题。

我相信我必须以某种方式将表格连接为“祖父母,父母,孩子”或类似的东西,但我不知道是否还有其他方式或者?

我甚至不确定我是否以正确的方式这样做。 有人可以就此提出建议吗?

我在数据库中有三个表。(下面是表格中的样本)

  1. materials_category保留数据库中每种资料的所有类别。

  2. materials包含类别名称和ID,material_names和ID以及每种材料的值。

  3. 有些材料有sub_categories。不仅仅是一些。 3. sub_materials保存类别信息,材料名称和ID,子材料名称和ID以及sub_material值。

    1. `materials_category`
    
     |category_id| category_name|
    ------------------------------
     |    1      | Aggregate    |
     |    2      | Aluminium    |
     |    3      | Asphalt      |
    
    
    2. `materials`
        |category_id |category_name |material_id |material_name|EE_1|EE_2|EC_1|EC_2
        ---------------------------------------------------------------------------
        | 1          |Aggregate     | 1          | General     |3   |0   | 52 | 8
        | 2          |Aluminium     | 2          | General     |55  |7   |  9 | 24
        | 2          |Aluminium     | 3          | Cast Pr     |34  |30  | 22 | 28
        | 2          |Aluminium     | 4          | Extrud.     |65  |16  |  8 | 74
        | 2          |Aluminium     | 5          | Rolled      |15  | 0  |  9 | 61
        | 3          |Asphalt       | 6          |Asphalt, 4%  |2   |22  | 6  | 54
        | 3          |Asphalt       | 7          |Asphalt, 5%  |3   |91  |  1 | 4
    
    3. `sub_materials`
    
    |category_id|category_name|material_id|material_name|sub_mar_id|sub_mar_name|EE_1|EE_2|EC_1|EC_2|   
    |2          |Aluminium    |2          |General      |1         |Virgin      |21  |5   |9   |60  |   
    |2          |Aluminium    |2          |General      |2         |Recycled    |29  |3   |8   |9   |
    

1 个答案:

答案 0 :(得分:0)

你的表是非规范化的。这通常不是一件好事,除非这是一个仅报告数据库。

无论如何,这是你追求的目标的开始。为什么不运行它并给出一些关于它是否是你想要的反馈。

select *
from materials_category c
left outer join materials m
on c.category_id = m.category_id
left outer join sub_materials s
on s.material_id = m.material_id
where c.category_name = 'Aluminium'

查看您的数据,我猜测它已经回收了#39;可以适用于任何数量的材料类别,而不仅仅是铝?你会收到一大堆“回收利用”吗?您的sub_materials中的记录是否允许每个material_category?