时常有人讨论结构化数据、非结构化数据。而且经常有争论。
- 有人说数据库是结构化(数据),Excel也是一种数据库,所以Excel是结构化。
- 有人说非结构化数据就是图片、视频、声音这些,所以Xml,Json不是非结构化,可以算作半结构化。
- 有人说图片文件也是有结构的,包括视频流也是有结构的。
我们先来看看百度百科中的定义:
结构化数据,简单来说就是数据库。结合到典型场景中更容易理解,比如企业ERP、财务系统;医疗HIS数据库;教育一卡通;政府行政审批;其他核心数据库等。
非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等等。
半结构化数据(semi-structured data)。和普通纯文本相比,半结构化数据具有一定的结构性,OEM(Object exchange Model)是一种典型的半结构化数据模型。(因为我不懂什么是OEM,所以划掉了)
以上定义我认真看了很多遍,不能完全理解。能得到一点简单的结论:数据库是结构化。好吧,那我把文件存到数据库中,可以吧?可以。也算结构化数据吗?不算,你这是抬杠。看,关于这方面的争论(争吵)还是挺多的。
如果说是否结构化决定了存储的方式,而又根据存储的方式来判断是否结构化,这种陷入互为因果的逻辑是没有意义的。争论一个问题是或不是,并不是我们的目的,我们为什么要争论这个问题,才是目的。换句话说,它对实践的指导意义是什么?
存储不是目的,存储后怎么使用才是目的所在。数据的应用从一个侧面来说就是为了能读。即是读得懂,或者是机器读得懂,或者是人读得懂。结构化数据和非结构化数据决定了不同的处理方式。结构化的数据,可以用于查询、加减乘除等数学运算、相等、比较大小、与或非等逻辑运算,还有计算、求和等统计运算。非结构化数据往往是还原出来,给人看和听,比如文章、图片、声音、视频。人可以看得懂,然后指挥机器进行拼装、删除、添加、剪辑。如果机器想“读得懂”这些数据,得采用的是OCR等技术来识别图片中的文字,NLP等技术来识别文字的词性或含义,总之是采用AI的方式来解析处理。与处理数据库的技术是完全不同的技术。所以,结构化与非结构化之间,相比存储方式的不同,更重要的是分析处理的工具不同。
一篇纯文本文章存入数据库,但结构化处理工具只能把它当作一个整体处理,说明纯文本也不一定是结构化数据。举个简单的例子,一个人名,中国汉字,3个字,让机器拆分出姓是什么,名是什么,这有难度。别说一定是左边一个字是姓,右边两个字是名。复姓了解一下。欧阳修、西门庆听说过吧。人为什么知道他姓欧阳名修呢?除了老师说的,另外一个原因是知道有"欧阳”、“西门”这两个复姓。所以机器可以把全部的复姓先存起来。还是前面的3字姓名,先判断左边两个字是不是复姓,即在不在复姓表中,在的话,左边两个字是姓右边一个字是名,即2+1,否则左边一个字是姓右边两个字是名,即1+2。严谨(抬杠)的来了,左边2个字“欧阳”就一定是姓欧阳么,”欧阳某”也可能是姓欧名阳某。同理夏候某,可能姓夏侯,也可能姓夏。通过这个小小的例子,就能感受到非结构化带来的,难以拆分,难以处理的问题。
如何要准确拆分姓和名,按结构化来,应该怎么存储和处理呢?这里提供两种处理方式:
1.把姓和名分别存储,在数据库中就是姓存一字段,名存一字段。如果数据来自界面用户的填写,也要让用户姓和名分开填。
2.如果非要写在一个字段中,可以规定姓和名中间有一个空格,并且姓不允许有空格,名也不允许有空格。读取时通过空格就能准确拆分姓和名。这就是结构化的做法。空格就是结构本身,它确定了子结构的范围。
无论是两个字段还是添加分隔符,都是一种结构,把姓和名分别存在这种结构中的两个容器中,读取的时候就能准确拿到姓或名。
当我从一个人的信息能准确拿到姓名时,姓名相对于一个人的信息来说,是结构化的。当我还要继续拆解出姓和名的时候,姓名是一个整体,它是非结构化的。所以是否结构化不是绝对的,看相对于什么而言,看你想拆解到哪种程度。
数据库中可以存一篇纯文本文章,这种可以看作是非结构化存在结构化之中。而图片文件这种非结构化的数据,它本身也有一定的结构。你中有我,我中有你,才是它们的实际关系。
感谢 螺丝钉 、Habby(QQ:1285219148) 协助阅稿并提出修改建议。