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

数据库对象属性那么多,你真的全清楚吗?每个对象到底有几套属性啊

(来源:某数据库技术社区资深版主“老王”的线下分享会记录)

今天咱们聊的这个话题,挺基础的,但很多人可能还真没完全搞明白,就是数据库里的这些对象,比如表啊、索引啊、视图啊,它们身上带的那些属性,感觉一大堆,有时候看着都眼花,那到底怎么分门别类,每个对象又到底有几套不同的“衣服”呢?咱今天就掰扯掰扯,不用那些绕口的专业词儿。

咱们得建立一个概念,用老王的话说,(来源:老王分享会)你可以把任何一个数据库对象,比如最常用的“表”,想象成一个人,这个人呢,有不同的社会角色,在不同的场合,别人看待他的角度不一样,描述他的属性也就不一样。

第一套属性,是“身份证属性”,或者说“定义属性”,这套属性是啥时候定的呢?就是你创建这个表的时候,一笔一划写清楚的,是它最根本、最核心的特征,这个表叫啥名?它里面都有哪些列?每个列是干啥的,是存数字的还是存文字的?能存多长?这些啊,(来源:老王比喻)就跟一个人的姓名、性别、出生日期、身份证号一样,是生下来就定好的,轻易不能变,变了可就成另一个东西了,或者至少是动了根本了,你比如说,你把一个原本存数字的列改成存文字,那以前的数据可能就全乱套了,这套属性,通常在你用CREATE TABLE这样的语句时,就一次性给它穿上了。

数据库对象属性那么多,你真的全清楚吗?每个对象到底有几套属性啊

第二套属性,是“状态属性”,或者叫“运行时属性”,这套属性描述的就不是它“是谁”了,而是它“现在怎么样”,还拿人打比方,(来源:老王比喻)比如一个人,他的定义属性是身高一米八,但他现在的状态属性可能是“正在坐着”或者“正在跑步”,对应到数据库的表上,就是这个表现在占了多少硬盘空间?里面有多少行数据?最近一次被修改是什么时候?这些属性不是一成不变的,而是随着你对这个表进行操作(增删改数据)在动态变化的,你删掉一万行数据,它占用的空间大小这个状态属性就变了,这套属性,你没法在创建的时候规定死,它是数据库系统自己维护和更新的,让你能知道这个对象的当前健康状况和负载情况。

第三套属性,比较特殊,是“权限属性”,这套属性定义了“谁能对这个对象干什么”。(来源:老王解释)这就像公司里的门禁和文件权限,一张表建好了,它就在那里,但不是谁都能看,不是谁都能改,老板可能能看能改,部门经理只能看自己部门的,普通员工可能连看都不能看,这套属性是独立于前面两套的,它管的是访问控制,你创建了一个表,只相当于盖了一栋房子,但谁有钥匙进门,谁只能趴窗户看一眼,谁能在屋里添家具,这都需要通过权限属性来单独设置,你可以理解成,每个对象除了自带“我是谁”(定义属性)和“我咋样了”(状态属性)的标签外,还贴着一张“谁可以对我做什么”的权限清单。

是不是所有对象都有这三套属性呢?基本上是的,但侧重点不同。

数据库对象属性那么多,你真的全清楚吗?每个对象到底有几套属性啊

像表(Table)、视图(View)这样的核心数据载体,三套属性都非常完整和重要,它们的定义属性复杂(有很多列和约束),状态属性需要密切关注(比如表的数据量),权限属性更是精细管理的重点。

而对于索引(Index)这类对象,它的定义属性相对简单,主要就是它基于哪个表的哪些列建的,是什么类型的索引,它的状态属性也很重要,比如索引的大小、深度、碎片化程度,这直接影响查询速度,权限属性呢,通常索引是跟着表走的,用户对表有查询权限,一般就能使用上面的索引,但某些特殊情况下也可能有独立的权限控制。

再比如存储过程、函数这些程序对象,它们的定义属性就是代码本身、参数列表等,状态属性可能不那么受关注(虽然也有创建时间等),但它们的权限属性极其重要,因为执行一个存储过程可能意味着进行一系列敏感操作,所以谁能执行需要严格规定。

回到开头的问题。(来源:老王总结)数据库对象确实属性繁多,但我们可以把它们梳理成三大类:定义它是什么的“本质属性”、描述它当前情况的“状态属性”、以及规定访问规则的“权限属性”,几乎每个对象都或多或少具备这三方面的属性,只是重要性因对象类型而异,理解了这套分类方法,下次再看到一堆属性列表时,心里就不会发怵了,可以分门别类地去理解和处理,比如想改表结构,那就找定义属性;想查看表有多大,就找状态属性;要分配权限,就去设置权限属性,这样是不是就清晰多了?