SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
我们来介绍一下:数据库是如何存储数据的。
数据库是如何存储数据的
来看一个小例子
scott 是Orale软件里面的一个例子,适合初学者学习。
现在,假如我们现在想存储员工的信息。也就是说:我们来通过这个例子来看看 字段、记录、表 是一个什么东西。
我们下面通过存储一个员工的信息,来把这些专业术语都来解释一遍。
假设有4个信息:
| 员工姓名 | 员工工资 | 员工性别 | 员工年龄 |
|---|
我们能不能这样去存储数据。比如举例:
如果我们按照正常的思维,这样存储是没有问题的。(其实这个员工表还缺少一列数据)但是如果我们真的在数据库里面这样存储数据的话,是会出问题的。
我们想象一下:如果你只是写了员工的姓名、工资、性别、年龄,将来可不可能会出现一个人和里面员工的人有一模一样的姓名。如果出现了一模一样的数据,数据库该如何辨别?
所以,它需要设置一个东西,来标识唯一的记录(行)。
如果信息(行)一样,那么保存起来就浪费了,术语叫:冗余。(简单的说:就是有两条数据彼此之间无法辨别了。)
那我们怎么办?
我们在现实中,是使用编号来解决这个问题的。
不管是人也好,产品也好,都是使用编号来标识唯一的一个事物的。
主键
所以:
张三这个人之前有4个属性:姓名、工资、性别 和 年龄。而确定一个数据唯一性的属性,有一个专门的词:主键。(现在张三这个人有5个属性了。)
主键:它也是事物的一个属性,它是可以标识事物唯一性的属性。
如果我们这样存放:
那么 部门姓名 和 部门地址 还有 部门人数 都会重复的出现,这样存储太消耗空间了。
所以我们将他们分开存储:
请问:
部门 需不需要 编号 这个属性呢?需要
记住:我们设计任何一个事物都需要主键(唯一的标识符)。如果没有唯一的标识符,那么事物和事物之间的区别就没有了。
所以,只要你想存数据,这个数据必须要有主键。没有主键,事物与事物之间没有办法区分。添加主键就是添加编号属性。
比如说人。人的身份证算不算是一个人的属性,身份证是单独添加的。我们人有鼻子,眼睛,嘴。身份证严格上讲并不是一个人的属性,只不过是为了标识,使用编号是很方便的。所以每个人才有了身份证号这个属性。
编号(主键)是无意义的,但是因为它太普遍的,我们认为它有意义。
在保存数据的时候,都是单独添加一个没有实际意义的、只为了编号的 数据来充当主键。它只起个标识作用。(现实生活中我们就是这样使用的,在实际的设计库的时候,我们也是这样设计的,和我们日常中是一模一样的。)
外键
员工和部门之间是有关系的,那么这个关系怎么去表达。
如果,我们想要将现实生活中特别复杂的事物保存到硬盘上,我们要如何存储?
你应该这样去考虑:
第一:个体如何存储;
第二:个体之间的关系如何存储。
把这两个搞定了,基本就都搞定了。
我们现在已经解决了个体如何存储。接下来就是个体之间的关系如何存储了。我们主流使用的数据库都是关系型数据库(就是一个二维表),而我们使用的编程语言是Java、C#这种面向对象的语言,这两种完全不同的解决问题的思想。
中间服务器是使用Java 或者 C# 实现的,后端是数据库实现的,它们之间如何进行交互的?
是通过Hibernate实现 一个映射,日后的博客中会介绍它。(如果日后,我们的数据库也是使用面向对象的思想实现的,那么这个Hibernate 就没用了。但是现在没有面向对象的数据库,这种思想的数据库技术还不成熟,所以 Hibernate现在还是需要学习的。)
什么是面向对象,大家已经知道了。但是什么是关系?
面向对象思想是通过类来实现的,而关系型数据库是通过表来实现的。而表与表之间的关系是通过什么来实现的呢?是通过一个叫:外键 的东西来表示的。
我们现在在员工表里面在添加一个:部门编号。
扩展:(编号通常是整型数字,如果数据量太大,整型数字不够用的话,编号通常是字母和数字组合使用。当时我们推荐编号使用整型数字。因为整型查找的时候很快,而字符串查找的时候很慢。)
这个 部门编号 就是外键。我们在员工表上添加了一列(部门编号),就解决了 表(员工表)与 表(部门表)之间的关系了。
我们想象一下,如果我们不在员工表里面添加 部门编号。而是在 部门表里面添加 员工编号。这样行不行?
当时是不行的,一个部门里面里面有很多的员工,并且员工的数量不同。所以,如果我们在部门表里面添加员工编号的话,有些部分的字段就很多,而有些部门的编号就很少,这样就不合适了吧。如果你想这样设计也可以,但是这样设计不好。
你在设计表之前,要想:员工与部门之间的关系是一对多还是多对一。意思就是:一个员工 对应 很多部门,还是 一个部门 对应 很多员工?
是一个部分对应多个员工。我们会将外键添加到多的一方,这样是最合理的。
我们日后会讲:多对多,一对一,一对多 这样的情况下,都如何使用外键来表示关系。现在大概有个印象就可以。
再解释一次:什么是外键?
连接两个表的字段叫做外键。
但是能不能再换一种更好的解释方式。主键是:标识唯一一个事物。而外键是:一个表中的数据来自另外一个表。(解释:员工表里面的一列数据(部门编号),它不是员工表本身的,它的数据是来自另外一个表(部门表)。)
总结:
在数据库里面的专业术语:
这样的一列叫:列 或者 字段。
这样的一行叫:记录 或者 元组。
这样的一行叫:记录 或者 元组 或者 属性。
这一个整体叫:表。
表中唯一能辨别一个记录与另一个记录不同的字段叫:主键。
如果有一个记录(列)不是来自于表本身的,是来自另外一个表的,它叫:外键。
SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)的更多相关文章
- SQL数据库学习,常用语句查询大全
数据库学习 sql server数据库基本概念 使用文件保存数据存在几个缺点: 1.文件的安全性问题: 2.文件不利于查询和对数据的管理: 3.文件不利于存放海量数据 4.文件在程序中控制不方便. 数 ...
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- 【转载】JMeter学习(一)工具简单介绍
JMeter学习(一)工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静 ...
- 一步一步学习SignalR进行实时通信_1_简单介绍
一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...
- JMeter学习笔记2-图形界面简单介绍
废话少说直接干活的给: 一.打开和运行JMeter,出现UI界面.如图下所示: 工具栏:常见操作的图标集合,有New(新建), Template(模板) ,Save(保存),Start(开始) ,St ...
- 通过 jdbc 分析数据库中的表结构和主键外键
文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- Sql Server 主键 外键约束
主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...
- 关系型数据库——主键&外键的
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学 ...
随机推荐
- (转)如何制作nodejs,npm “绿色”安装包
摘自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=8625039&id=3817492 由于公司环境 ...
- Redis简单介绍与安装
Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主要特点,使它优越于其它键值数据存储系统 - 1) Redis将其数据库完全保存在内 ...
- Android 系统四大组件
Android 系统四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver)和内容提供器(Content Provider). 活动是所有 A ...
- SVN checkout 出的项目在PHPstorm中打开没有subversion(SVN)选项按钮怎么办?
对于svn add 命令的批量操作,为了操作简便还是习惯在IDE中完成,有时候新checkout出的项目,在PHPstorm中右键菜单中没有 Subversion 按钮,操作如下: 点击VCS按钮,然 ...
- JFreeChart API 说明(转)
原地址 http://blog.csdn.net/mike_caoyong/article/details/7338160 JFreeChart目前是最好的java图形解决方案,基本能够解决目前的图形 ...
- jmeter 历史版本下载
在官网下载: https://jmeter.apache.org/download_jmeter.cgi 新版本 要从命令行启动 cd 到bin目录下 使用 sh jmeter
- 同步机制之--java之CountDownLatch闭锁
CountDownLatch闭锁 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.CountDown ...
- webpack快速入门(三):资源管理
上一章说了基本的webpack是用,包括命令行打包,npm脚本打包等基础的东西. 这篇说一下webpack的资源管理,包括(图片,字体,数据),首先调整一下项目结构成: webpack-demo |- ...
- 阿里云专有网络下一键安装RouterOS-ROS系统
1.阿里云环境centos6.9 x64: 内网网卡为eth0 阿里云的linux下硬盘名称为/dev/vda 注意阿里云的安全组建议开放任意协议和端口,任意IP允许访问 今天测试阿里云2C4G的死活 ...
- pyc是什么
python是解释型语言,需要解释器对程序逐行做出解释,然后直接运行. C语言是编译型语言,PC不需要翻译,直接执行就可以了. java也是解释型语言,不过速度可以跟编译型媲美. 用java举例,ja ...