毛金玲
摘要:數(shù)據(jù)庫去重的實現(xiàn)中主要介紹了如何通過嵌套匹配,查找以主鍵為中心的重復元組,并建立相應的臨時表存儲全部重復數(shù)據(jù)去掉后的數(shù)據(jù)和重復數(shù)據(jù)刪除至一條元組的數(shù)據(jù),將兩個臨時表合一,即為最后實驗所需的數(shù)據(jù)表。數(shù)據(jù)庫倒排索引的實現(xiàn)中主要利用MySQL軟件自帶的全文索引功能,在正確的引擎下對數(shù)據(jù)表中的每個屬性列建立相應的全文索引。
關鍵詞:數(shù)據(jù)庫設計 去重實現(xiàn) 索引實現(xiàn)
1 數(shù)據(jù)庫設計
本系統(tǒng)為面向關系數(shù)據(jù)庫的關鍵字查詢系統(tǒng),在實驗中本文選取了IMDB 數(shù)據(jù)集,為了進行實驗,將數(shù)據(jù)集整理為以下七個表數(shù)據(jù)結構。
實驗數(shù)據(jù)集(電影信息數(shù)據(jù)庫):
Actor(演員表)、Consume(設計師)、Director(導演信息)、Business(投資)、Editor(編輯)、Color(顏色信息)、Keyword(關鍵詞)。本數(shù)據(jù)庫抽象的數(shù)據(jù)庫關系E-R圖如圖1所示。
2 數(shù)據(jù)庫去重實現(xiàn)
本系統(tǒng)主要采用MySQL關系型數(shù)據(jù)庫,對數(shù)據(jù)庫的基本操作如下。(系統(tǒng)實現(xiàn))
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 實現(xiàn)數(shù)據(jù)庫的連接功能。
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 提交數(shù)據(jù)庫方法。
public void commit() throws SQLException
{
conn.commit();
}
2.4 回滾數(shù)據(jù)庫方法。
public void rollback() throws SQLException
{
conn.rollback();
}
2.5 關閉數(shù)據(jù)庫方法。
public void close() throws SQLException
{
ptmt.close();
conn.close();
}
在實驗數(shù)據(jù)集中,默認**name屬性值不重復,當然我們所熟知的actorname為演員名,而重名也是很常見的,在允許重名時為每個表新建一個屬性列id,并設為Primary Key,但是在本實驗中設定不重名。這就要刪除數(shù)據(jù)庫表中重復的元組以設定Primary Key。(以Consume表為例)
原始表中設定Primary Key:Consumename。出現(xiàn)錯誤Duplicate entry ‘Greenwood Jane Ifor key ‘PRIMARY,說明在Keyword表中存在consumename屬性值一樣的元組,需要對關系表去重來確定主鍵。
3 數(shù)據(jù)庫索引實現(xiàn)
索引的實現(xiàn)相對簡單,由于數(shù)據(jù)庫管理系統(tǒng)中支持文本屬性的全文索引,所以可以直接利用關系數(shù)據(jù)庫的全文索引。全文索引是一個倒排文件,它以屬性對的形式記錄了每一個關鍵字以及關鍵字出現(xiàn)的位置,一些關系數(shù)據(jù)庫系統(tǒng)中,不僅僅能記錄關鍵字所出現(xiàn)的位置,同時還能返回與查詢的相關性得分。
全文索引在MySQL中是一個FULLTEXT類型索引。FULLTEXT索引用于MyISAM表,可以在CREATE TABLE 時或之后使用ALTER TABLE或CREATE INDEX在CHAR、VARCHAR或TEXT 列上創(chuàng)建。對于大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個沒有FULLTEXT 索引的表中,然后再使用ALTER TABLE(或CREATE INDEX)創(chuàng)建索引,這將是非常快的。將數(shù)據(jù)裝載到一個已經(jīng)有FULLTEXT索引的表中,將是非常慢的。
索引表一般使用倒排表(InversionList),即由索引項查找相應的文檔。索引表也要記錄索引項在文檔中的位置,以便檢索器計算索引項之間的相鄰或接近關系。當數(shù)據(jù)量很大時,必須實現(xiàn)即時索引,否則不能夠跟上信息急劇增加的速度。即是指在索引過程中邊建立邊存入索引庫。索引算法對索引器的性能有很大的影響。一個搜索引擎的有效性在很大程度上取決于建立索引的質量,本系統(tǒng)在創(chuàng)建索引時有兩種方法:
3.1 在創(chuàng)建表時,直接把全文索引加在SQL語句中,這種方式的全文搜索通過MATCH()函數(shù)完成。(以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 自帶的創(chuàng)建全文索引的功能,以actor表為例,實現(xiàn)如圖2所示。
4 結語
數(shù)據(jù)庫去重的實現(xiàn)中主要介紹了如何通過嵌套匹配,查找以主鍵為中心的重復元組,并建立相應的臨時表存儲全部重復數(shù)據(jù)去掉后的數(shù)據(jù)和重復數(shù)據(jù)刪除至一條元組的數(shù)據(jù),將兩個臨時表合一,即為最后實驗所需的數(shù)據(jù)表。數(shù)據(jù)庫倒排索引的實現(xiàn)中主要利用MySQL軟件自帶的全文索引功能,在正確的引擎下對數(shù)據(jù)表中的每個屬性列建立相應的全文索引。
參考文獻:
[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.