技多不压身 | 产品经理需知的那些数据库基础知识

10 评论 12688 浏览 190 收藏 26 分钟

技多不压身,无论是什么数据产品经理还是其他品类的产品经理,都需要懂点数据库知识。懂技术能让你在跟开发撕逼中多了一个资本。

随着近几年AI智能,大数据的发展,“产品经理是是否需要懂技术?”“产品经理应该对技术理解到什么程度?”诸如此类的问题又再次出现在许多人的视野中,或者说它就未曾离开过。

笔者认为,这要具体放到某个具体业务场景或者行业下去分析,例如:作为一名数据产品经理,你可能需要懂一些数据库,大数据的相关知识;作为一名AI语音产品经理,你可能需要懂一些关于自然语言处理(NLP)的相关技术。

当然,技多不压身,懂技术能让你在跟开发撕逼中多了一个资本。

在进入正文之前,我们先来思考几个小问题:

    1. 当你在一个APP或者网站注册账户时,你填写的信息保存在哪里?
    2. 当你尝试登陆和平精英准备吃鸡时,APP怎么知道是你,并提供差异化服务?
    3. 当你修改一个账号的密码时,为什么可以用马上新密码登陆了?
  1. 当你在一个APP或者网站注销账号时,请问你的账户信息如何变化?

这四个问题看起来很简单,但深究起来,它对应着数据库的四个基本操作CRUD:即增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)。

何为数据库?

百度百科对数据库给出以下定义:

所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

数据库可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

简单的理解:数据库(DataBase,简称DB)是用于保存有组织的数据的容器。

在DB中,数据通常以一种结构化的文件——表,作为其展现形式。对DB的操作可以看做是对DB中表的操作,而对DB中表的操作可以类比为对Excel中表的操作。

数据库中的表有行和列的概念,符合我们的常规认知。

列是表中的一个字段,存储着相同属性的数据,例如:一列专门来存储用户的账号昵称。

行是表中的一个记录,可用于存储某一个用户的完整信息,例如:用户A,男,22岁,身高170cm,体重120斤。

表中的某一列(或一组列)我们称为主键,其值可以用来唯一区分表中每个行(或者说每条记录)。说白了,主键就是用来唯一代表某条记录(某行)的。

主键需满足以下条件:

  1. 任意两行都不具有相同的主键值。
  2. 每个行都必须具有一个主键值,即主键不允许设置为Null的值。

举个例子:在学生管理系统中,我们用学号来唯一代表每个学生,此时学号所在的那一列就是主键。

那么,如何理解某一组列作为主键呢?

当我们无法用单独的某一列来代表一条记录时,我们就要采用某两列或者某几列来共同代表一条记录。

例如:一个表格记录着一个班级的学生,不同课程的不同考试中的数据时,你想从中找出学生A,每一次考试中的语文成绩时,就需要以学号和课程名称这两列来作为复合主键。

DBMS与SQL?

一般情况下,我们不会去直接操作数据库,往往是通过数据库管理系统(Database Management System,简称DBMS)去对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。

典型的DBMS包括例如:MySQL,Oracle,mongoDB,Redis等等。

这里注意一点:在平时交流的时候,许多人会直接将MySQL,Oracle等称作是数据库,很多网上的资料也是这么写的。但从严格意义上来讲,MySQL,Oracle应该是数据库管理系统。

为了方便大家跟网上的资料能够共同理解,笔者在此暂时称呼MySQL为数据库。

目前主流数据库基本分为两类:关系型数据库和非关系型数据库。

关系型数据库是指采用了关系模型来组织数据的数据库。其最典型的数据结构是表,结构相对固定,格式一致,易于维护。但是灵活性不强,读写性能比较差,尤其是在海量数据的处理上,效率不高。

非关系型数据库狭义上讲并不是一种数据库,而是一种数据结构化存储方法的集合。因为大多数经典的关系型数据库命名都为“***SQL”,为了做出区分,行业内通常将非关系型数据库统称为NoSQL。NoSQL格式灵活,可以很好的满足高并发读写需求,成本低,速度快。

在安装完MySQL之后,他会帮我们顺带安装数据库。我们就可以直接通过MySQL的命令窗口启动服务,并对数据库进行操作。

例如在下图中,笔者在win10系统中,先以管理员权限打开PowerShell,然后启动MySQL命令窗口,再通过“create database test;”创建一个名称为test的数据库。(一般情况下,不建议用root登陆)

这种操作方式对于非技术人员来讲,并不是十分友好。因此在日常使用中,我会采用MySQL+Navicat来实现对数据库的操作。

Navicat是一套多连接数据库开发工具,工具中带有灵活的数据库图形可视化界面,方便用户直接进行类如Excel的表格操作,由此来实现最终的数据库操作。

SQL(Structured Query Language)是结构化查询语言,可以用来和数据库通信,绝大部分DBMS都支持SQL,简单的说就是通过编写SQL语句来操作数据库。

在下面的操作中,笔者也将以MySQL+Navicat作为基础开发环境,以SQL语法为说明。

实战演练

对数据库DB,数据库管理系统DBMS,结构化查询语言SQL有所了解后,让我们继续回到开篇讲的四个问题。

  1. 当你在一个APP或者网站注册账户时,你填写的信息保存在哪里?
  2. 当你尝试登陆和平精英准备吃鸡时,APP怎么知道是你,并提供差异化服务?
  3. 当你修改一个账号的密码时,为什么可以用马上新密码登陆了?
  4. 当你在一个APP或者网站注销账号时,请问你的账户信息如何变化?

将这四个步骤拼接在一起,可以得出一个最简单的用户账户注册、登录、修改、注销的流程。

这四部分对应到数据库的相关操作就是增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)。

1. 事前准备

我们先在Navicat中跟一个已存在的数据库进行连接,然后建立一张名为user_test的表,表中分别有字段:ID(作为主键)、account(账户名)、password(密码)、source(注册来源)、name(真实姓名)、age(年龄)、job(职业)。

2. 注册步骤及其SQL

在用户注册时,会在注册界面填写相应的信息,点击页面底部的注册按键,系统将执行数据库记录插入操作,其通用SQL语法为:

  • 其中INSERT INTO表示插入动作,大小写都可以,标准写法为大写。
  • 其中table_name为表名,指你所要操作的表,一般为小写。
  • 其中field1, field2,…fieldN为对应的字段名,一般字段命名为小写或驼峰式。
  • 其中value1, value2,…valueN为每个字段对应的值,写入值需符合字段定义的数据类型。

最后,所有SQL语法中都以 “;”作为语句结尾,这个不要漏了。

在本例中,对应的SQL为:

经过插入操作后,数据库中表的结果为

在这里,因为我们的表中的ID字段设置为主键,并且由数据库进行自增操作,所以我们不会对其进行额外操作。

3. 登陆步骤及其SQL

假设当前数据库中user_test表的数据如下:

在用户登录时,系统会根据用户输入的账户名去数据库中检索,如果没有查询到相应的账户名,则提示账户不存在;如果查询到账户名,则再根据数据库中该账户名的密码去跟用户登录时输入的密码进行匹配,如果匹配失败,则提示密码输入错误,反之登陆成功。

所以在这个步骤中,执行的是数据库的查询操作,其通用的SQL语句为:

  • 其中SELECT代表查询操作,一般用大写。
  • 其中column_name,column_name…表示你要查询的列名,跟表中的列名要保持一致。
  • 其中table_name代表你所要查询的表。
  • 其中[WHERE Clause]表示你要查询这张表时,所约束的条件。

在本例中,假设是RD李四登陆,则根据李四的账户名“用户2”查询其密码,年龄,注册来源,职业,姓名这几个字段信息的SQL为:

经过查询操作后,得出的查询结果为:

4. 更新步骤及其SQL

假设当前数据库中user_test表的数据如下:

在用户登录成功后,可以对密码进行更改,系统根据当前登陆账户,将旧密码更改为新密码。

所以在这个步骤中,执行的是数据库的更新操作,其通用的SQL语句为:

  • 其中UPDATE代表更新操作,一般用大写。
  • 其中table_name代表你所要操作的表。
  • 其中field1,field2代表你要更新的字段,需要跟你表格中定义的字段名一致。
  • 其中new-value1,new-value2代表更新字段的值,写入值需要与定义的数据类型一致。

其中[WHERE Clause]表示你要更新这张表时,所约束的条件。在这里注意一点,进行UPDATE操作时,一定要跟上[WHERE Clause],不然将会把整张表的数据更新。

在本例中,假设我们要对QA王五的密码和职业进行更新,则SQL为:

经过更新操作后,数据库中表的结果变为:

5. 注销步骤及其SQL

假设当前数据库中user_test表的数据如下:

当用户试图注销自己的账号时,系统会根据相应的账户名对用户的信息进行删除。至于删除哪些信息,取决于业务要求。有些应用会将用户信息全部删除,有些则会保留一些基础信息,方便用户二次注册的时候,可以快速完成。

所以,在这个步骤执行的是数据库的删除操作,其通用的SQL为:

  • 其中DELETE表示删除操作。
  • 其中table_name表示你要操作的表格。
  • 其中[WHERE Clause]表示你要删除某条记录时,所约束的条件。在这里注意一点,进行DELETE操作时,一定要跟上[WHERE Clause],不然将会把整张表的数据删除,数据库数据一旦删除,是不可恢复的,切记!

在本例中,假设我们要将RD李四的账户注销,并且删除其所有数据,则SQL为:

创新型数据库

1. 时序数据库

时序数据库(Time Series Database,简称TSDB)是非关系型数据库中的一种,也是很重要的一种。

随着目前AI智能的发展,在很多场景下,特别是将来的工业互联网中,我们需要收集海量的过去式数据,借此来分析和预测将来可能发生的事情。例如:金融交易股票走势,物联网传感器设备的测量数据,气温或日湿度预测等等。

以股票走势预测为例,单靠目前股票的位点是无法分析的,只有结合股票在前十分钟,前一个小时,甚至前几天的走势,才能更加精准的预测出未来某一时刻的具体情况。

时序数据库就是专门用来存储海量时序数据的。而时序数据就是基于时间的一系列数据。

简单地可以理解成,它以时间为主坐标轴,以需要被记录的数据作为纵轴,通过规则的时间间隔或者是不规则的时间间隔去表征一系列数据的规律性或异常性变化。

时序数据库包含以下几个基础部分:

  1. Metric: 度量,相当于关系型数据库中的table。
  2. Data point: 数据点,相当于关系型数据库中的row。
  3. Timestamp:时间戳,代表数据点产生的时间。
  4. Field:度量下的不同字段。比如位置这个度量具有经度和纬度两个field。一般情况下存放的是会随着时间戳的变化而变化的数据。
  5. Tag:标签,或者附加信息。一般存放的是并不随着时间戳变化的属性信息。timestamp加上所有的tags可以认为是table的主键。

有的小伙伴可能会说,直接在一般的数据库中,加入一个代表时间的列,不就可以完成吗。在数据比较少,数据库操作不频繁的时候,这种方法还是可以的。

随着数据存储量的增多,如果想要达到跟时序数据库一样的效果,那就会频繁的操作数据库,这会造成极大的开销,从而极大的降低读写速度。

总的来说,时序数据库具有大规模数据支持,多精度数据存储,多标签数据查询等特点。

2. 图数据库

非关系型数据库NoSQL大致可以分为四类:

  1. 键值(key-value)数据库
  2. 图数据库
  3. 列存储数据库
  4. 文档型数据库

图数据库就是NoSQL其中的一种,它以图这种数据结构存储和查询数据。图由两个主要元素组成:节点和关系。

节点代表一个实体(时间,地点,人或其他数据),关系则代表两个节点之间的关联方式。

相比于NoSQL中的其他类型数据库而言,图数据库具有更加丰富的模型表现能力和更加高效的索引。

在实际应用中,业务逻辑往往十分复杂,如果用关系型数据库来表示各个实体之间的潜在关系,则需要建立十分多的关联表。数据库需要通过关联表间接地维护实体间的关系,导致数据库的执行效能低下,同时也会引起关联表的数量急剧上升。

例如:在一个订单系统中,要清楚表现出用户、订单、商品之间的逻辑关系,需要建立四张关联表,这显得十分复杂,开发效率也很低。

而在图数据库中,我们只需要建立四个节点,并用关系来表示节点之间的逻辑,最后用任意两个节点之间的关系去索引,即可提升效率。随着业务逻辑性愈发的复杂,数据量的增多,关联表数量会急剧上升,这时图数据库的优势愈发明显。

小结

随着大数据,AI智能的发展,为解决不同业务需求,越来越多的创新数据库随之出现,时序数据库和图数据库就是其中之一。时序数据库解决了时间序列数据存储,索引的问题;图数据库则解决了复杂逻辑下,各个实体之间相互表征,索引的问题。

数据库攻击及防护

对于每个应用而言,数据库为其提供了前后台数据交互的作用。对于企业而言,数据库存储了海量的用户数据,一旦数据库被攻击或被破坏,将会导致用户信息泄露,进而导致一系列无法弥补的损失。因而,数据库的保护工作极其重要,特别是一些涉及金融,政府层面的数据。

在云计算领域中,数据库还被作为一种资源进行出售。例如:亚马逊的AWS数据库、腾讯云数据库、阿里云数据库、百度云数据库等等。通过租用有实力公司的云数据库,不仅能免除小企业自身架设机房,采购物理硬件,招聘专业运维人员的成本,还能享受高性能云数据库服务以及高质量的防护措施。

常见的数据库攻击方式及其防护措施如下:

1. 对弱口令或默认用户名/口令的破解

在早期的数据库中,有些数据库在安装时会有一个默认的口令,有些管理人员偷懒,干脆就延用了默认口令,那么黑客就可能从这个口令出发去获取攻击数据库。

措施:采用安全程度高的口令,避免使用默认口令。

2. SQL注入

SQL注入指通过任意SQL代码插入数据库查询,使攻击者能够绕过应用程序安全措施,完全控制Web应用程序后面的数据库服务器,对数据进行CRUD操作。

措施:尽量避免直接将用户的输入放到SQL语句中,使用准备好的语句和参数化查询,并且定期测试与数据库交互的Web应用程序,查看后台日志信息。

3. 特权提升

数据库会被许多人共同使用,有测试人员、开发人员、产品经理等等,每个人员分配的权限是不一样的。

最高级的root权限一般只开放给高级别的Leader。如果在权限配置中,一个用户被误授予超过其实际需要的访问权限。那么攻击者只需要得到少许特权用户的口令,就可以毫无阻碍的进入数据库系统。

措施:定期审查每个用户的权限,通过后台日志分析及时更改误授人员的权限。

总结

至此为止,相信大家对数据库以及相关知识已经有了一个感性的认知。

数据库的知识比较多,不是一两篇文章就能讲清楚的。笔者整体写的也比较粗糙,希望能给各位同行带来一些帮助。承蒙大家不嫌弃的话,笔者愿意在后续再写几篇相关的,与大家一同学习和进步。

文中部分内容参考网上资料。

 

本文由 @pm_SWolf 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自Unsplash,基于CC0协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 通俗易懂

    来自上海 回复
  2. 写的真好,简单易懂,谢谢你

    来自上海 回复
  3. 非常感谢,你好我有几个问题可否私聊v:17839130192

    来自浙江 回复
  4. 一下子懂了不少

    回复
    1. 欢迎交流!

      来自浙江 回复
  5. 谢谢!如果大家真的要在工作中使用的话,建议自己动手尝试一下,这样可以发现很多潜在问题。如有不懂,也可以私聊我一起交流探讨。

    回复
  6. 💡 清晰明了

    来自北京 回复
    1. 谢谢!如果真的要在工作中使用的话,建议自己动手尝试一下,这样可以发现很多潜在问题。如有不懂,也可以私聊我交流。

      回复
  7. 好文,对于一些基本概念的讲解应该会有助于产品工作和思考,赞,期待后续文章

    回复
    1. 谢谢,后面写几篇更深入的,供大家一起交流学习。

      回复