同福

Python做个搜索引擎(2)MySQL数据库设计【20201005】

介绍

介绍

昨天我们已经设计好了搜索引擎的模型,搜索引擎包括两个基本模型即:网站和网页。那么接下来我们就要针对这两个模型进行数据库的设计了。

设计数据库要考虑的问题很多,包括数据的大小、字段的数量、读取场景,写入场景等等。

除此之外还要考虑使用什么数据库引擎,因为不同的数据库引擎的特长是不一样的,我们要充分利用它们的这些特长之处,来将我们的项目的运行效率调整到最优状态。

这个搜索引擎福哥会使用两个数据库引擎,即:MySQL和ElasticSearch。因为存储数据来讲我们学过的数据库引擎里MySQL是最佳选择。而说到查询功能,尤其是全文查询功能,自然是非ElasticSearch不可了。

MySQL数据库设计

数据库名称,福哥写的是“tfse”,即:tongfu search engine,大家可以根据自己的喜好取名。数据库的编码福哥使用的是主流的UTF-8编码。

create database tfse default charset utf8;

选择数据库“tfse”,将当前数据库切换为“tfse”。

use tfse;

800c3aa897b3d196.jpg

MySQL数据表设计

网站信息表

网站信息这个数据表名称福哥取名“websites”。

网站信息的数据表字段,福哥初步规划如下:

  • websiteId,int,auto,primary(自增列)

  • domainName,varchar,unique(网站域名)

  • title,varchar(网站标题)

  • descript,varchar(网站描述)

  • weight,smallint(权重)

  • createDT,datetime(建立时间)

  • lastFetchDT,datetime(最后采集时间)

  • nextFetchDT,datetime(下次采集时间)

create table websites (
websiteId int not null auto_increment,
domainName varchar(100) not null,
title varchar(100) null,
descript varchar(500) null,
weight smallint not null default 1,
createDT datetime not null,
lastFetchDT datetime null,
nextFetchDT datetime null,
primary key (websiteId),
unique u_domainName (domainName)
);

839552af092bd9b5.jpg

网页信息表

网页信息这个数据表名称福哥取名“webpages”。

网页信息的数据表字段,福哥初步规划如下:

  • webpageId,int,auto,primary(自增列)

  • url,varchar,unique(网页URL)

  • statusCode,smallint(服务器状态码)

  • charset,tinyint(网页编码,用数字表示,0 - GBK,1 - UTF-8,2 - BIG5,3 - ISO)

  • title,varchar(网页标题)

  • keywords,varchar(网页关键字)

  • description,varchar(网页描述)

  • createDT,datetime(建立时间)

  • lastFetchDT,datetime(最后采集时间)

create table webpages (
webpageId int not null auto_increment,
url varchar(254) not null,
statusCode smallint not null,
charset tinyint not null default 1,
title varchar(100) null,
keywords varchar(300) null,
description varchar(500) null,
createDT datetime not null,
lastFetchDT datetime null,
primary key (webpageId),
unique u_url (url)
);

549e62b79b158835.jpg

网页数据表

网页数据这个数据表名称福哥取名“webpage_data”。这个表是webpages表的附属表,目的是将网页源代码这样的大型字段从网页信息表分离开。

网页数据的数据表字段,福哥初步规划如下:

  • webpageId,int(关联键,关联webpages.webpageId字段)

  • sourceCode,longtext(网页源代码)

  • pageText,longtext(网页文字,将源代码去掉html标签后的部分)

create table webpage_data (
webpageId int not null,
sourceCode longtext not null,
pageText longtext not null,
primary key (webpageId)
);

47cee581c5bad439.jpg

名词解释

字段类型

MySQL数据表字段和编程语言一样,是分不同类型的,这里我们把常用的介绍一下

  • int,整型,可存储整型数据

  • char,定长字符类型,可以存储字符串数据

  • varchar,变长字符类型,可以存储字符串数据

  • text,文本类型,可以存储大量的字符串数据

  • tinyint,微整型

  • smallint,小整型

  • longtext,长文本类型

字段索引

MySQL数据表可以利用数据表的索引提高检索速度,或者控制数据表中的数据格式等等

  • primary key,主键,规定为主键的字段是不能有重复数据的,一个数据表只能有一个主键

  • unique,约束,规定为约束的字段也是不能有重复数据的

  • auto,自增列,这个字段比较特殊,在新增数据的时候,这个字段会字段填充数据,其值是在当前数据表中自增列值里最大的那个值加一的值,从而可以保证这个自增列数据唯一

总结

MySQL数据库是关系型数据库,它的特点体现在“关系”两个字上面,我们建立的websites表是网站表,而webpages表则是基于websites表的,然后webpage_data表是webpages表的附属表,从数据表的关系就可以看出模型之间的关系。

而我们在后面进行数据检索的时候,也是要依据这样的关系进行的。

这样的关系型数据库特别适合做基础数据库,将所有模型的数据都依据设计好的关系存储起来,便于我们今后进行管理,分析,统计工作。