例如,以上面的表为例,要从横向表中获取所有男性雇员的记录,我们可以使用以下的select语句:
Select * from HR where 性别 like '男'
而要从纵向表中获取同样的数据,我们就需要进行自连接查询,先获取ID,然后获取数据:
| Select * from VR where id in (Select id from VR where key = '性别' and value = '男') |
很多开发人员会编写一些特别的函数或存储过程将纵向结构表转换为横向结构,只有这样做,他们才能做出报表,并能够更容易地使用这些数据。
纵向表分组
纵向数据存储的变体能够引入自定义算法把逻辑数据行聚类。这意味着可以使用两个或以上ID列来作为分组属性。例如:
|
ID |
分组 |
KEY |
VALUE |
|
123 |
1 |
姓名 |
李丽 |
|
123 |
1 |
电话 |
22221111 |
|
123 |
2 |
机器 |
HP 520 |
|
123 |
2 |
供应商 |
Verizon |
|
234 |
1 |
姓名 |
马军 |
|
234 |
1 |
电话 |
33334444 |
|
234 |
1 |
电子邮件 |
m@mail.com |
|
243 |
2 |
机器 |
IBM T61 |
当生成自定义报表时,可以很容易地根据第二个“分组”列来将不同的内容分割到不同的页或不同的区域内。因此,上面的纵向表可以得到以下报表:
|
Report 1 |
| |||
|
|
Page 1 |
| ||
|
姓名 |
电话 |
| ||
|
李丽 |
22221111 |
| ||
|
Page 2 |
| |||
|
机器: HP 520 | ||||
|
供应商: Verizon | ||||
|
Report 2 |
| |||
|
|
Page 1 |
| ||
|
姓名 |
电话 |
电子邮件 | ||
|
马军 |
33334444 |
m@mail.com | ||
|
Page 2 |
| |||
|
机器: IBM T61 | ||||
总结
本文为大家介绍了在数据库表中存储数据的两种不同方式。虽然纵向数据布局的缺点往往会把它的优点覆盖掉,但某些情况下为了获得灵活性,这种纵向结构是设计数据组织结构的唯一出路。另一方面,横向表则是管理数据库管理系统中存储数据的传统模式,更易于实现数据规范化。对于软件和数据库架构师而言,要选择何种设计方式来长久保存数据取决于特定的应用需求。

