【发布时间】:2020-01-18 21:02:12
【问题描述】:
我正在尝试为以下问题找出数据模型:
我有一个energy sources
| name |
|------------------|
| windmill |
| oil |
| water_powerplant |
attributes的列表:
| name |
|---------|
| location|
| size |
| oil_type|
属性列表values:
| name |attribute|
|---------|---------|
| offshore|location |
| onshore |location |
| big |size |
| small |size |
| crude |oil_type |
| bunker |oil_type |
以及energy sources可以拥有哪些attributes的列表:
| source |attribute|
|-----------------|---------|
| windmill |location |
| windmill |size |
| oil |oil_type |
| water_powerplant|size |
我现在需要的是一个表格,我可以在其中存储源值和属性值的每种组合的能量值。例如,我将如何存储small offshore windmill 的值?我能想到的最好的方法是提出一些自定义约定,将多个属性值组合成一个值......
| source |attribute_values |kwh_per_hour|
|-----------------|-----------------------------|------------|
| windmill |size=small location=offshore |285 |
或为属性创建固定数量的列。然而,这会极大地限制灵活性。
| source |att_1|att_val_1|attr_2 |attr_val_2|kwh_per_hour|
|-----------------|-----|---------|--------|----------|------------|
| windmill |size |small |location|offshore |285 |
是否已经有一些好的解决方案来说明如何做到这一点?
【问题讨论】:
-
这听起来很像EAV model。不,您绝对不应该使用固定数量的列并将其非规范化存储。
-
您可以尝试使用
jsonb列作为属性。但是由于它被标记为 [relational database],听起来您实际上想使用外键对其进行建模以确保仅输入有效的组合? -
jsonb实际上可能是一个很好的解决方案。我并不担心有效的组合,因为它是一个小规模的项目,我自己输入数据。我会检查一下。谢谢! -
这取决于您的数据处理模式。对于 OLTP 案例,您可以使用 EAV 模型进行扩展。对于 OLAP,所有属性名称都成为维度。
标签: sql postgresql database-design