无痛 SQL Schema 的10 条军规(3)

正确的做法是将这样的表转化为不包含重复列的模式,因为这样的模式将很容易查询。例如,在一个查询中计算某个调查表中已完成的题目的数目:

select

sum(

(casewhen answer1 isnotnull

then1else0end)+

(casewhen answer2 isnotnull

then1else0end)+

(casewhen answer3 isnotnull

then1else0end)

)as num_answers

from surveys

whereid=123

-- vs

select count(response)

from answers

where survey_id =123

对于查询分析而言,从JSON列抽出数据的操作将大幅降低查询的性能。虽然有很多很棒的理由支持我们在产品中使用JSON列,但是对于查询分析来说并不是这样。大胆得将JSON列拆解为更简单数据类型,可以使查询分析变得更快更容易。

10.不要过度规范化

日期,邮编和国家不需要使用带有外键查询的表单独存放。过度地规范化将会导致每个查询后面都要带上一些相同的表连接操作。这样不但创建了许多重复的SQL,而且数据库为此还要做很多额外的工作。

select

dates.d,

count(1)

fromusers

join dates on users.created_date_id = dates.id

groupby1

-- vs

select

date(created_at),

count(1)

fromusers

groupby1

表是数据库中的一等对象,拥有很多属于自己的数据。其余的任何数据都可以作为另一个更重要对象的附加列。

更好的模式在等着你! 如你所期待的,对于你和团队的新成员来说,遵循这些规则将有助于下一张表或者数据仓库变得更容易查询。如果你不认可或者有更多的规则建议,请联系我们吧。我们很期待听到你的声音!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9c112f3d9decd57f07928f3a71ab3123.html