数据库设计关联关系表的意义是什么?
数据库设计关联关系表,⽬的是承载"数据建模"的"数据结构"部分。
"数据建模"的第⼆个部分,是"数据操作"。即对存量和流量业务数据的各种业务处理和存储。
这部分早期是通过存储过程以及数据库⾃⾝的功能来约束,⽐如,⾃定义函数,存储过程等。随着程序越来越复杂,在⼯业界实践中,"数据操作"这部分逐渐从数据库系统中剥离,通过程序来实现。
实际上,有些数据结构,甚⾄也剥离出来通过配置⽂件的形式存在了。
所以,"数据结构"的设计,必须结合"数据操作"的程序实现⽅式,不是完全按照范式的规定来的。
范式是什么?(normal form),就是规范化的样式,是⼀些要求和建议性的规则,俗话就是这样做最合理。
当然也有别的理。范式不是必须实现的标准。随着操作数据的程序各异和世界的发展,数据结构的设计也必然多种多样。
但是,在关系数据建模中,有⼀些是不变的。那就是,抛开所有的业务细节和操作要求,
1,表都是实体的集合
2,实体有唯⼀标识
3,实体之间是有联系的,⽽联系通过关系表⽰
对于关系,只有三种就可以充分表达。即⼀:⼀,⼀:多,多:多
⾄此,我们就明⽩关系表的意义就是,仅通过这3种关系,就可清晰的表⽰所有的表数据结构。
那么这三种关系,是如何在关系数据库中实现的?
思路很简单,就是将主键,当做⼀个维度。通过维度建⽴坐标系来表⽰点。
在本⽂的例⼦中,员⼯ID是个主键。所以员⼯表是个⼀维空间。部门ID是个主键,部门表也是个以维空间。员⼯和部门,在各⾃的⼀维空间中独⽴存在。此时是没有关系存在的。
如果要有关系,这两个主键所代表的字段,为简单起见,假设出现在同⼀个表:"员⼯+部门"表中。
(通过中间实体间接关联情况,是基于简单的演变,这⾥只考虑基本模式)
考虑最简单情况,员⼯ID+部门ID构成联合主键。
可见,此时该表是个⼆维空间,所以表达的关系是个多:多的关系。
那么如何表⽰⼀:多关系?
⾸先必须确定⼀,因此这个空间必须是个⼀维空间。
假设是员⼯空间,那么员⼯ID就是唯⼀的主键。此时,部门ID作为⼀个属性介⼊这个世界,可以看做有⽆数个平⾏的员⼯ID维度线,⽽员⼯实体,就通过升维散落到这些平⾏线上。但这些员⼯实体,投影到某个具体的员⼯ID维度线上时,⼜是不重合的。
这样,就实现了⼀:多的关系。
即同⼀个部门(注意这⾥的表达,这⾥的⼀是部门),在这个维度线上,有很多个员⼯ID实体。
可想⽽知,部门ID,不必须是外部主键。也就是说,不是必须有个部门表。因此这⾥的部门ID,完全可以换位部门的名称。
⾄此知道,关系仅仅是数量层⾯的⼀种现象,实际的约束是要结合业务才能正确解释。
这种做法,和原来的员⼯表有冗余模式,因此通常就收敛到在员⼯表中,嵌⼊部门ID的⽅式。
⾄于⼀:⼀的关系,只需要在⼀:多的基础上,要求多字段的属性为unique即可。数据库设计的意义
当然unique,也可通过程序来控制。⽤程序也是⼀种很常见的表⽰⽅式。
⾄于原来的员⼯表,和现有的关系表,对于员⼯来说,也是个⼀对⼀关系。但这种关系,是通过数据来表达,也就是程序来保证的。同样的情况还有表的垂直切分。
下⾯回到问题上来。
1,两种⽅案都可以表达员⼯和部门的关系。
2,⽅案1,在数据关系上,仅仅是⼀对多。
3,⽅案2,在数据关系上,其实是多对多。兼容了⼀对多的情况。
因此,⽅案2的扩展性显然要更加强。这⾥不能⽤范式或反范式来下结论。因为部门和员⼯的关系,可能以后真的就成了多对多。何况还有程序中的数据操作也表达了数据关系,因此仅仅通过数据表的结构,不能简单的得到反范式的结论。
更进⼀步,在考虑到性能时,有时反范式也是需要的。
⽐如员⼯部门表独⽴出来,可以进⾏表缓存,甚⾄进⼀步加载到缓存数据库中。这样员⼯登录时,系统
可快速根据部门情况决定其权限。如果员⼯表⾮常⼤,每次都要进⾏关联查询⽆疑是增加了数据库的压⼒。这是常见的空间换时间的打法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论