SQL反模式-1

SQL反模式讲了很多数据库设计中遇到的难题。跟我最近的工作很相关。因此特意拜读了下。本文主要讲解“多值列”和“幼稚的树”

多值列要分成映射表,比如(A,B),其中B是多值的列,则应该把A和B分开,然后为B单独建一张表,并在其中加入指向A的外键。这样做可以确保对B的某个值进行查询时效率较高。

还有一种比较特殊的结构,父亲-儿子关系表。比如 employee和经理的管理。通常情况下经理有层次结构,某个的人同时是经理和employee。如果要查询某个经理下所有的employee时,通常需要逐级的下钻。如果以此为维度表,去join一个employee的事实,则导致性能上的问题。

一种可能的做法是在在employee的事实表中增加一列,用来表示该employee到其ancestors的根路径。这样可以很容易找到一个employee所有的父亲,或者一个ancestors的所有孩子。这样的话,查询层次结构只需要一次就可以了。

还有一种方式是增加一个打平的ancestor表,这表有两列,一列存放所有的employee,另一列存放它管辖的employee,每一行表示一个manager和employee的管辖关系。比较特殊的是,自己可以管辖自己。这个的好处是,修改起来比较方便,因为ancestor的信息没有写死。缺点是一个ancestor的所有孩子未必在同一个地方,查询时会导致多余的IO。

转载于:https://www.cnblogs.com/alphablox/p/3405303.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值