eBay数据库设计与实现.docx
《eBay数据库设计与实现.docx》由会员分享,可在线阅读,更多相关《eBay数据库设计与实现.docx(17页珍藏版)》请在冰豆网上搜索。
![eBay数据库设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-11/19/25c0e38f-f9a9-43b1-b27e-fdae83dfab3d/25c0e38f-f9a9-43b1-b27e-fdae83dfab3d1.gif)
eBay数据库设计与实现
挑战2eBay数据库设计和实现
挑战数据:
提供十年前从eBay网站下载的大量拍卖数据,数据格式为XML。
挑战要求:
要求设计一个合理的关系数据模式(数据库),同时编写C++程序将XML格式的数据,基于设计的数据模式转换成SQLServer/PostgreSQL能够导入的文本格式,并在SQLServer/PostgreSQL上建立设计的数据模式,导入转换得到的数据,并通过SQL查询操作进行测试和验证。
挑战步骤:
PartA设计关系数据模式
根据xml说明文档和实际的eBay拍卖数据,设计一个合理的关系数据模式,回答以下5个步骤。
1.列出你设计的所有关系,为每个关系指定主码,此阶段可以不指定数据类型。
users(userid,rating,location,country);
item(itemid,name,currently,Buy_Price,First_Bid,Number_of_Bids,Started,Ends,seller,Description);
category(category);
item_category(itemid,category);
item_bids(itemid,time,bidder,amount)
2.列出你设计的关系中的所有函数依赖,也可以回答“没有”。
users:
userid→rating,location,country;
item:
itemid→name,currently,Buy_Price,First_Bid,Number_of_Bids,Started,Ends,seller,Description;
item_bids:
itemid,time→bidder,amount)
3.你设计的关系是否属于Boyce-CoddNormalForm(BCNF)范式?
如果不是,请重新设计,或者解释为什么采用非BCNF较好。
属于BC范式
4.列出你设计的关系中的所有多值依赖,也可以回答“没有”。
item_category:
itemid→→category;
5.你设计的关系是否属于第4范式?
如果不是,请重新设计,或者解释为什么采用非4-NF较好。
属于第4范式
PartB编写数据转换程序
1.考虑到对XML代码处理的效率,使用c#进行编程,使用其自带的System.Xml进行XML文件的读取。
2.XML文件存放在程序Debug文件夹下。
3.根据设计的关系数据库模型,同步生成4个文本文件(item.txt、item_bid.txt、item_ca.txt、user.txt)。
4.数据处理过程中,考虑对元数据中可能影响数据导入的因素进行处理,包括日期、单引号、逗号等,使用“《《》》”作为列分隔符。
5.由于SQLServer的数据导入导出工具的文本数据转换出错,所以直接利用C#对生成的四个文本文件进行再处理,生成包含SQL插入语句的文本文件(iitem.txt、iitem_bid.txt、iitem_ca.txt、iuser.txt)。
6.文件均生成在程序Debug文件夹下。
PartC将转换生成的数据导入SQLServer
1.在SQLServer上新建数据库(eBay),创建设计的关系数据模式,即createtable,并指定主码还外码,执行create.sql。
注意:
XML拍卖数据中的Description数据长度较长,部分超过8000字符,应将类型设计为varchar(MAX),保证数据在插入过程中不因截断而出错。
数据库初始大小为100M。
2.表创建后,利用程序生成的文本文件,进行数据导入导入。
在数据导入的过程中,执行单个insert文件时间较长,且提示“资源池'internal'没有足够的系统内存来运行此查询。
”将部分数据导入分批进行,依次导入insert-1.sql~insert_8.sql,可以保证所有数据导入成功。
3.由于直接生成的文本数据存在一定的重复,不满足部分表的主键要求,所以创建临时表——userstem、item_categorytem,在此基础上进行唯一查询后,再将数据导入相关表。
最后删除临时表。
此操作包含在insert.sql文件中。
insertintousers
selectdistinct*
fromuserstem;
droptableuserstem;
insertintocategory
selectdistinctcategory
fromitem_categorytem;
insertintoitem_category
selectdistinct*
fromitem_categorytem;
droptableitem_categorytem;
PartD测试你生成的数据库
SQLServer/PostgreSQL导入数据后,首先对每个关系进行测试验证是否正确导入,然后实现以下查询来检查数据库的正确性。
1.关系验证
1)users——存在locating、country为空的用户,黄色显示,为空值,
2)item——日期、金额数据正常,空值保留
Description数据字段最长字节13960
Description数据字段内容
3)category
4)item_category——存在多值依赖
5)item_bids——日期、金额数据正常
2.用户人数。
selectcount(*)
fromusers
3.来自NewYork的用户人数(即用户的location为“NewYork”,区分大小写)。
selectcount(*)
fromusers
wherelocation='NewYork';
4.所属类别(category)个数为4的拍卖(auction)次数。
selectCOUNT(*)
from(
selectitemid,count(*)ascount
fromitem_category
groupbyitemid
)a
wherecount=4
5.当前价格最高的拍卖(aucion)的ID。
selectitemid,currently
fromitem
wherecurrently=(selectmax(currently)
fromitem
)
6.等级(rating)大于1000的卖家(seller)人数。
selectCOUNT(*)
fromusers
whererating>1000anduseridin(selectseller
fromitem
)
7.既是卖家(seller)又是投标人(bidder)的用户人数。
selectCOUNT(*)
fromusers
whereuseridin(selectseller
fromitem
)
anduseridin(selectbidder
fromitem_bids
)
8.类别(category)至少包含一个投标(bid)大于$100的物体(item),这样类别的数目。
selectCOUNT(*)
fromcategory
wherecategoryin(
selectcategory
fromitem,item_bids,item_category
whereitem.itemid=item_bids.itemid
anditem.itemid=item_category.itemid
andamount>100
)
9.上述查询时间均不超过10s。
挑战感想:
挑战二对是对eBay拍卖数据进行建库,数据来源于XML文件,XML的标签使得数据比较明晰,主要的难度在于如何批量的处理XML文件,获得商品的各项信息。
考虑到C#本身就有处理XML的类库,我就是用C#编程,处理数据,在简单学习相关函数和对象后,基本实现了数据的提取。
在利用数据库导入工具时,由于部分字段的转化错误,所以决定在原有文本文件的基础上,直接生成数据插入的sql文件。
在实际数据导入的过程中,数据量一度接近百兆,导致内存不存,数据导入失败。
通过分析,我将数据分阶段导入,利用临时表进行处理,完成了数据的导入。
在整个过程中,我根据数据导入过程中出现的异常,不断修改程序,使得生成的文件更利于导入。
在不断的尝试中,一点点的达成目的,数据库的设计也越来越完善,通过创建的商品的类型表,极大的提高了查询的效率,提高了数据的完整性。