PostgreSQL Composite types Useful type or Useless type
PostgreSQL 虽然可以归为 RDS 数据库,但他有的一些特性,又会让程序员觉得和自己编制程序有类似的地方。
今天想learn about Composite types. 这个类型的是一个让人很迷糊的东西,但如果你从程序员的角度来考虑,这个类型的确是有点“程序化”的思维模式。
1 什么是 composite type, 说白了就是组合类型。我们举一个例子:
一个家庭有男人,女人,孩子(假定家庭是这样的,如果你说两个男人或两个女人,我也不反对,跑题了)。家庭就是假定就是三个人组成的,而如果我们在设计传统的表格中,我们怎么来表达他???
create table family ( id int,
male_name varchar(10),
female_name varchar(10),
child_name varchar(10) )
这样建表或许没有什么不妥,但如果我这样建立这个表呢?
从上面的截图看,首先创建一个类型,然后在创建表的时候,引用那个类型,然后插入数据,搜索数据的时候,都需要字段作为前缀,在去查询语句。
我觉得首先会有人反对这样的设计,觉得毫无意义。一开始我也是这样,这是一个什么设计方式,后来我在读了某些“资料” 后得到了启发。
这属于一种表格设计中的事务化,例如一个家庭,他必然至少要有两个人,而一般来说,我们在设计表格的时候,家庭的成员在设计表的时候被分割了,他们并不是一个整体。
而我们在设计有些事情的时候,经常会忘记整体,而将一个整体变为一个个个体存储,这是有问题的。
例如我们在处理钱这个事情上,钱有很多种,尤其在当下,各国的货币,比特币,纪念币,纪念钞,等等,如果只将这些东西的数量 和他的属性分割来存储,则比如你在做SUM 的运算中,就会得到一个错误的数据,而将这些货币的属性和数量一起以一个整体存储,到觉得从属性上看更有意义。
如果我们用传统的方式来处理,一个家庭,如果一个家庭丧偶,或离婚,我们在传统设计中至少会添加另一个字段来标注这个家庭为什么没有父亲,但如果我们不这样设计,我们用Composite types方式来设计家庭这个关系,在今天统计叫 Justin的孩子中,或许有的孩子没有爸爸,但count出来的信息虽然爸爸这个位置是没有信息,但却出现数字 3 ,这意味着,每个人都有爸爸,虽然他现在不在了,但他一定存在过,并且你不能否认他的存在。或许这就是表格设计的事务化的一种思维模式,或许你不能理解。
当然也可以通过其他的查询方式,得到当前还有爸爸的人的数量
或许这也是POSTGRESQL 被称为“object性”数据库的由来吧!