当前位置:首页 > 问答 > 正文

数据库里非键属性到底是啥,怎么理解和应用才算深入探讨

忘掉那些复杂的术语,想象一下,你有一个通讯录,这个通讯录本身就是一个最简单的“数据库”,通讯录里每一行是一个人的信息,姓名、电话号码、家庭住址、工作单位、生日。

你要怎么快速准确地找到“张三”这个人呢?你肯定会去翻看“姓名”这一栏,在这个通讯录里,“姓名”就是一个键属性,更具体地说,它像是这个通讯录的“主键”,因为理论上,每个人的名字应该是唯一的(至少在你的这个小圈子里,你不会记录两个完全同名的张三),它能唯一地确定一条记录。

除了“姓名”之外的其他信息呢?“电话号码”、“家庭住址”、“工作单位”、“生日”……这些就是非键属性,它们是什么?它们就是描述“张三”这个实体的各种特征、各种信息。键属性(如姓名)是用来“定位”和“识别”的,而非键属性(如电话、地址)是用来“描述”和“说明”的。

这就是最核心、最根本的理解:非键属性是依赖于键属性而存在的描述性信息。 没有“张三”这个主体,他的电话号码和家庭地址就失去了意义,它们是“附属”于主体的细节。

(来源:基于关系数据库基础理论中的函数依赖概念)

数据库里非键属性到底是啥,怎么理解和应用才算深入探讨

怎么才算是深入理解和应用?

如果你只理解到“非键属性就是除了主键以外的列”,那只是停留在表面,深入探讨意味着你要思考这些非键属性在数据库设计、数据质量和实际业务中扮演的角色和带来的影响。

理解非键属性与“数据冗余”的恩怨情仇

这是第一个关键点,假设你的通讯录里,除了“张三”,还有“李四”、“王五”,而巧了,他们三个人都在“某某科技有限公司”工作,如果你在每个人的记录后面都完整地写上“某某科技有限公司”,工作单位”这个非键属性的值就重复出现了三次,这就是数据冗余

数据冗余会带来什么问题?

数据库里非键属性到底是啥,怎么理解和应用才算深入探讨

  • 浪费空间:虽然现在存储便宜,但大量重复也是浪费。
  • 更新异常:这是最要命的,某某科技有限公司”搬家了,改名叫“超级科技有限公司”了,你必须把数据库中所有出现这个公司名字的地方都找出来修改,万一漏掉了“张三”的没改,数据就不一致了,张三的工作单位信息就错了。
  • 插入和删除异常:如果公司新来了一个“赵六”,但你暂时只知道他的公司名,不知道他的电话,你可能就无法录入他的信息(因为电话是必填的),或者,如果公司里最后一个人离职了,你删除他个人信息的同时,可能把这个公司的信息也从数据库里彻底抹掉了,即使这个公司本身是存在的。

(来源:数据库设计范式理论,特别是第一范式(1NF)之后要解决的核心问题)

那么如何解决?这就引出了数据库设计的艺术——规范化,你可能会把“工作单位”这个非键属性单独拿出来,做成一张新的“公司表”,里面用“公司ID”作为主键,然后只在原来的通讯录里存一个“公司ID”,这样,公司名只存储一次,修改也只需要修改一次,通讯录里的“公司ID”就是一个外键,它引用了另一张表的主键,这时,在你的通讯录表里,“公司ID”虽然也是一个属性,但它已经不是描述个人特征的“非键属性”了,它变成了一个关系纽带。

理解非键属性与“查询效率”的权衡

上面说的规范化听起来很完美,对吧?但它也有代价,如果我想查询“在某某科技有限公司工作的所有人的电话号码”,在冗余设计下(所有信息在一张表里),数据库可能一次查询就搞定,但在规范化的设计下,数据库需要先到“公司表”里根据公司名找到公司ID,再拿着这个ID回到通讯录表里去找对应的人,这相当于联表查询,可能会更慢。

数据库里非键属性到底是啥,怎么理解和应用才算深入探讨

深入的应用就在于权衡,是接受一定的数据冗余来换取极致的查询速度(这种做法常被称为“反范式化”),还是严格遵守规范化来保证数据的一致性和减少冗余?这完全取决于你的业务需求,对于需要频繁快速读写的电商网站商品详情页,他们可能会把很多信息冗余存储在一起;而对于需要高度一致性的银行交易系统,规范化则是铁律。

(来源:数据库性能优化实践中的反范式化设计思想)

理解非键属性决定了数据的“味道”

非键属性才是数据的血肉,是业务价值的真正体现,主键“001”对你来说毫无意义,但它的非键属性“商品名称:智能手机,价格:5999元,库存:100”才让你知道这到底是什么,对非键属性的管理至关重要:

  • 约束:给非键属性加上约束,价格”不能为负数,“邮箱”必须符合邮箱格式,这能保证数据的质量。
  • 索引:虽然非键属性不是主键,但如果你经常需要根据“生日”来查询同龄人,那么给“生日”这个非键属性建立一个索引,会大大加快查询速度,索引就像是给书加上目录,让你不用一页一页地翻。
  • 语义:仔细设计非键属性,地址”是作为一个字段存“XX省XX市XX区XX街道”,还是拆分成“省”、“市”、“区”、“详细地址”多个字段?后者显然更利于后续按地区进行统计分析。

非键属性绝不是“键属性之外的边角料”,它的存在,引发了数据库设计中最核心的“冗余与一致性”、“规范与性能”的矛盾,能否根据实际业务场景,合理地设计、管理和权衡非键属性,是区分一个数据库使用者是新手还是资深专家的关键标志,你对待非键属性的方式,直接决定了你的数据库是臃肿混乱的数据沼泽,还是高效可靠的数据宝库。