数据库表模式,用于存储类似于对象的动态属性

时间:2017-06-19 15:52:09

标签: sql sqlite

我有一个简单的YAML。

- name: name_1 
  k1: v1_1 
  k2: v2_1 
  k3: v3_1
- name: name_2 
  k1: v1_2 
  k2: v2_2 
  k3: v3_2
- name: name_3
  k1: v1_3 
  k2: v2_3 
  k3: v3_3

属性'名称可能因不同项目而异。

我想把这个yaml数据放到sqlite数据库中。因此,我创建了两个表:objattr

Table:obj

obj_id      name      
----------  ----------
1           name_1    
2           name_2    
3           name_3    

Table: attr

id          obj_id      key         value     
----------  ----------  ----------  ----------
1           1           k1          v1_1      
2           1           k2          v2_1      
3           1           k3          v3_1      
4           2           k1          v1_2      
5           2           k2          v2_2      
6           2           k3          v3_2      
7           3           k1          v1_3      
8           3           k2          v2_3      
9           3           k3          v3_3      

我希望输出如下:

obj_id      name        k1          k2          k3        
----------  ----------  ----------  ----------  ----------
1           name_1      v1_1        v2_1        v3_1      
2           name_2      v1_2        v2_2        v3_2      
3           name_3      v1_3        v2_3        v3_3      

我使用此查询:

select * 
from 
    obj 
    natural join (select obj_id, value as k1 from attr where key = 'k1' ) 
    natural join (select obj_id, value as k2 from attr where key = 'k2' ) 
    natural join (select obj_id, value as k3 from attr where key = 'k3' ) 
;

这可以产生很多单词的输出。 而且,在另一个项目中,属性名称可能会改变,让我们说该属性可能是(k4,k5,k6)。 我必须再次重写这个查询。

我有两个问题:

  1. 任何更好的查询语法,使这更优雅?
  2. 任何更好的查询语法都允许查询适用于任何密钥可能不同的项目吗?

0 个答案:

没有答案