毛金玲
摘要:数据库去重的实现中主要介绍了如何通过嵌套匹配,查找以主键为中心的重复元组,并建立相应的临时表存储全部重复数据去掉后的数据和重复数据删除至一条元组的数据,将两个临时表合一,即为最后实验所需的数据表。数据库倒排索引的实现中主要利用MySQL软件自带的全文索引功能,在正确的引擎下对数据表中的每个属性列建立相应的全文索引。
关键词:数据库设计 去重实现 索引实现
1 数据库设计
本系统为面向关系数据库的关键字查询系统,在实验中本文选取了IMDB 数据集,为了进行实验,将数据集整理为以下七个表数据结构。
实验数据集(电影信息数据库):
Actor(演员表)、Consume(设计师)、Director(导演信息)、Business(投资)、Editor(编辑)、Color(颜色信息)、Keyword(关键词)。本数据库抽象的数据库关系E-R图如图1所示。
2 数据库去重实现
本系统主要采用MySQL关系型数据库,对数据库的基本操作如下。(系统实现)
2.1 在程序中定义了DBbase基。其中 MySQL驱动类描述符为“net.sourceforge.jtds.jdbc.Driver”。
protected final String password = "123456 ";
protected static finalString mysql = "net.sourceforge
.jtds.jdbc.Driver ";
2.2 实现数据库的连接功能。
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class cc {
private static String dburl = "jdbc:mysql://localhost:3306/diany?user=root&password=123456";
public conn() {
try {
Connection con = DriverManager.getConnection(dburl);
System.out.println("connect successfully");
}
catch(SQLException se) {
se.printStackTrace();
}
}
public static void main(String[] args) {
new conn();
}
}
2.3 提交数据库方法。
public void commit() throws SQLException
{
conn.commit();
}
2.4 回滚数据库方法。
public void rollback() throws SQLException
{
conn.rollback();
}
2.5 关闭数据库方法。
public void close() throws SQLException
{
ptmt.close();
conn.close();
}
在实验数据集中,默认**name属性值不重复,当然我们所熟知的actorname为演员名,而重名也是很常见的,在允许重名时为每个表新建一个属性列id,并设为Primary Key,但是在本实验中设定不重名。这就要删除数据库表中重复的元组以设定Primary Key。(以Consume表为例)
原始表中设定Primary Key:Consumename。出现错误Duplicate entry ‘Greenwood Jane Ifor key ‘PRIMARY,说明在Keyword表中存在consumename属性值一样的元组,需要对关系表去重来确定主键。
3 数据库索引实现
索引的实现相对简单,由于数据库管理系统中支持文本属性的全文索引,所以可以直接利用关系数据库的全文索引。全文索引是一个倒排文件,它以属性对的形式记录了每一个关键字以及關键字出现的位置,一些关系数据库系统中,不仅仅能记录关键字所出现的位置,同时还能返回与查询的相关性得分。
全文索引在MySQL中是一个FULLTEXT类型索引。FULLTEXT索引用于MyISAM表,可以在CREATE TABLE 时或之后使用ALTER TABLE或CREATE INDEX在CHAR、VARCHAR或TEXT 列上创建。对于大的数据库,将数据装载到一个没有FULLTEXT 索引的表中,然后再使用ALTER TABLE(或CREATE INDEX)创建索引,这将是非常快的。将数据装载到一个已经有FULLTEXT索引的表中,将是非常慢的。
索引表一般使用倒排表(InversionList),即由索引项查找相应的文档。索引表也要记录索引项在文档中的位置,以便检索器计算索引项之间的相邻或接近关系。当数据量很大时,必须实现即时索引,否则不能够跟上信息急剧增加的速度。即是指在索引过程中边建立边存入索引库。索引算法对索引器的性能有很大的影响。一个搜索引擎的有效性在很大程度上取决于建立索引的质量,本系统在创建索引时有两种方法:
3.1 在創建表时,直接把全文索引加在SQL语句中,这种方式的全文搜索通过MATCH()函数完成。(以actor表为例)
mysql> CREATE TABLE actor (
->actorname varchar(50) PRIMARY KEY,
->sex varchar(2),
-> mvname varchar(50),
->mvyear varchar(10),
-> mvactorname varchar(10),
-> position varchar(20),
->made varchar(10),
->setname varchar(50),
->episode varchar(10),
->date varchar(10),
->classification varchar(30),
->FULLTEXT('actorname','sex','mvname','mvyear','mvactorname','position','made','setname','episode','date','classification')
->);
3.2 Navicat for MySQL 自带的创建全文索引的功能,以actor表为例,实现如图2所示。
4 结语
数据库去重的实现中主要介绍了如何通过嵌套匹配,查找以主键为中心的重复元组,并建立相应的临时表存储全部重复数据去掉后的数据和重复数据删除至一条元组的数据,将两个临时表合一,即为最后实验所需的数据表。数据库倒排索引的实现中主要利用MySQL软件自带的全文索引功能,在正确的引擎下对数据表中的每个属性列建立相应的全文索引。
参考文献:
[1]Zhang J, Zhao H, Wang S. QuickCN: A Combined Approach for Efficient Keyword Search over Databases[A]. Proceedings of the 12th International Conference on Database Systems for Advanced Applications[C] ,2007, 1032-1035.
[2]Guo L, Ju F, Hao W. DBease:Making Databases User-friendly and Easily Accessible[A]. Fifth Biennial Conference on Innovative Data Systems Research[C], 2011, 45-56.
[3]Ju F, Guo L, Li Z. Interactive SQL Query Suggestion: Making Databases User-Friendly[A]. Proceedings of the 27th ICDE[C], 2011, 351-362.