<!ELEMENT catgraph (edge*)>
<!ELEMENT edge EMPTY>
<!ATTLIST edge from IDREF #REQUIRED to IDREF #REQUIRED>
<!ELEMENT regions (africa, asia, australia, europe, namerica, samerica)>
<!ELEMENT africa (item*)>
<!ELEMENT asia (item*)>
<!ELEMENT australia (item*)>
<!ELEMENT namerica (item*)>
<!ELEMENT samerica (item*)>
<!ELEMENT europe (item*)>
<!ELEMENT item (location, quantity, name, payment,
description, shipping, incategory+, mailbox)>
<!ATTLIST item id ID #REQUIRED
featured CDATA #IMPLIED>
<!ELEMENT location (#PCDATA)>
<!ELEMENT quantity (#PCDATA)>
<!ELEMENT payment (#PCDATA)>
<!ELEMENT shipping (#PCDATA)>
<!ELEMENT reserve (#PCDATA)>
<!ELEMENT incategory EMPTY>
<!ATTLIST incategory category IDREF #REQUIRED>
<!ELEMENT mailbox (mail*)>
<!ELEMENT mail (from, to, date, text)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT itemref EMPTY>
<!ATTLIST itemref item IDREF #REQUIRED>
<!ELEMENT personref EMPTY>
<!ATTLIST personref person IDREF #REQUIRED>
<!ELEMENT people (person*)>
<!ELEMENT person (name, emailaddress, phone?, address?,
homepage?, creditcard?, profile?, watches?)>
<!ATTLIST person id ID #REQUIRED>
<!ELEMENT emailaddress (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT address (street, city, country, province?, zipcode)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT province (#PCDATA)>
<!ELEMENT zipcode (#PCDATA)>
<!ELEMENT country (#PCDATA)>
<!ELEMENT homepage (#PCDATA)>
<!ELEMENT creditcard (#PCDATA)>
<!ELEMENT profile (interest*, education?, gender?, business, age?)>
<!ATTLIST profile income CDATA #IMPLIED>
<!ELEMENT interest EMPTY>
<!ATTLIST interest category IDREF #REQUIRED>
<!ELEMENT education (#PCDATA)>
<!ELEMENT income (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ELEMENT business (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT watches (watch*)>
<!ELEMENT watch EMPTY>
<!ATTLIST watch open_auction IDREF #REQUIRED>
<!ELEMENT open_auctions (open_auction*)>
<!ELEMENT open_auction (initial, reserve?, bidder*, current,
privacy?, itemref, seller, annotation, quantity, type, interval)>
<!ATTLIST open_auction id ID #REQUIRED>
<!ELEMENT privacy (#PCDATA)>
<!ELEMENT initial (#PCDATA)>
<!ELEMENT bidder (date, time, personref, increase)>
<!ELEMENT seller EMPTY>
<!ATTLIST seller person IDREF #REQUIRED>
<!ELEMENT current (#PCDATA)>
<!ELEMENT increase (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT interval (start, end)>
<!ELEMENT start (#PCDATA)>
<!ELEMENT end (#PCDATA)>
<!ELEMENT time (#PCDATA)>
<!ELEMENT status (#PCDATA)>
<!ELEMENT amount (#PCDATA)>
<!ELEMENT closed_auctions (closed_auction*)>
<!ELEMENT closed_auction (seller, buyer, itemref, price, date,
quantity, type, annotation?)>
<!ELEMENT buyer EMPTY>
<!ATTLIST buyer person IDREF #REQUIRED>
<!ELEMENT price (#PCDATA)>
<!ELEMENT annotation (author, description?, happiness)>
<!ELEMENT author EMPTY>
<!ATTLIST author person IDREF #REQUIRED>
<!ELEMENT happiness (#PCDATA)>
2.7.1.3 Часть графа DTD XMark - в People узла
DTD в People узла
<!ELEMENT people (person*)>
<!ELEMENT person (name, emailaddress, phone?, address?,
homepage?, creditcard?, profile?, watches?)>
<!ATTLIST person id ID #REQUIRED>
<!ELEMENT emailaddress (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT address (street, city, country, province?, zipcode)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT province (#PCDATA)>
<!ELEMENT zipcode (#PCDATA)>
<!ELEMENT country (#PCDATA)>
<!ELEMENT homepage (#PCDATA)>
<!ELEMENT creditcard (#PCDATA)>
<!ELEMENT profile (interest*, education?, gender?, business, age?)>
<!ATTLIST profile income CDATA #IMPLIED>
<!ELEMENT interest EMPTY>
<!ATTLIST interest category IDREF #REQUIRED>
<!ELEMENT education (#PCDATA)>
<!ELEMENT income (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ELEMENT business (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT watches (watch*)>
<!ELEMENT watch EMPTY>
<!ATTLIST watch open_auction IDREF #REQUIRED>
2.7.1.4 Отношение Shema от графа DTD
a. The Basic Inlining Technique
People(peopleID:integer,people.person.id:String,people.person.name:String,people.person.emailaddress:String,people.person.phone:String,people.person.address.street:String, people.person.address.city:String, people.person.address.country:String, people.person.address.province:String, people.person.address.zipcode:String,people.person.homepage:String,people.person.creditcard:String, people.person.profile.interest.category:String, people.person.profile.business:String, people.person.profile.education:String, people.person.profile.gender:String, people.person.profile.income:String, people.person.profile.age:String,people.person.wathes.wath.open-auction:String)
Person(personID:integer,person.id:String,person.name:String,person.emailaddress:String,person.phone:String,person.address.street:String,person.address.city:String,person.address.country:String,person.address.province:String,person.address.zipcode:String,person.homepage:String,person.creditcard:String,person.profile.interest.category:String,person.profile.business:String, person.profile.education:String, person.profile.gender:String, person.profile.income:String, person.profile.age:String, person.wathes.wath.open-auction:String)
Name (nameID: Integer, name: String)
Emailaddress (emailaddressID: Integer, emailaddress: String)
Phone (phoneID: Integer, phone: String)
Address(addressID:Integer,address.street:String, address.city:String,address.country:String,address.province:String,address.zipcode:String)
Street(streetID:Integer,street:String)
City(CityID:Integer,city:String)
Country(countryID:Integer,country:String)
Province(provinceID:Integer,province:String)
Zipcode(zipcodeID:Integer,zipcode:String)
Homepage(homepageID:Integer,homepage:String)
Creditcard(creditcardID:Integer,creditcard:String)
Profile(profileID:Integer,profile.interest.category:String,profile.business:String,profile.education:String,profile.income:String,profile.gender:String,profile.age:String)
Interest (interestID: Integer, interest.category: String)
Category(categoryID:Integer,category:String)
Business(businessID:Integer,business:String)
Education(educationID:Integer,education:String)
Gender(genderID:Integer,gender:String)
Age(ageID:Integer,age:String)
Watches(watchesID:Integer,watch.open-auction:String)
Watch(watchID:Integer,watch:String)
b. The Shared Inlining Technique
People.person(people.personID:integer,people.person.name.isroot:Boolean,people.person.name:String,people.person.emailaddress.isroot:Boolean,people.person.emailaddress:String, people.person.phone.isroot:Boolean,people.person.phone:String, people.person.homepage.isroot:Boolean,people.person.homepage:String, people.person.creditcard.isroot:Boolean,people.person.creditcard:String,)
Address(addressID:Integer,address.parentID:Integer,address.street.isroot:Boolean,address.street:String,address.city.isroot:Boolean,address.city:String,address.country.isroot:Boolean,address.country:String,address.province.isroot:Boolean,address.province:String,address.zipcode.isroot:Boolean,address.zipcode:String)
Profile(profileID:Integer,profile.parentID:Integer,profile.interest.isroot:Boolean,profile.interest.category:String,profile.education.isroot:Boolean,profile.education:String,profile.business.isroot:Boolean,profile.business:String,profile.gender.isroot:Boolean,profile.gender:String,profile.age.isroot:Boolean,profile.age:String,profile.income:String)
Interest(interestID:Integer,interest.parentID:Integer,interest.category:String)
Watches(watchesID:Integer,watches.parentID:Integer,watches.watch.isroot:Boolean,watches.watch.open-auction:String)
Watch(watchID:integer,watch.parentID:Integer,watch.open-auction:String)
Отношение Shema Hibird Inlining Методика в этом случаи подобно отношению Shema Shared Inlining Методики.
2.7.2. Подход атрибутов
2.7.2.1 Подход Edge таблицы.
Наиболее простой хранить все атрибуты в единственной таблице: позвольте нам называть эту таблицу таблицей Edge. Таблица Edge делает запись oid источника и объектов маленького круглого щита атрибута, имя атрибута, флажок, который указывает, является ли атрибут меж-объектной ссылкой или poit к значению, и порядковое число имело обыкновение возвращать весь атрибуты объекта в праве и выполнять модификации, если объекты имеют несколько атрибутов с тем же самым именем.
Таблица Edge имеет следующую структуру:
Edge(sourceID, tag, ordinal, targeteID, Data )
Ключ таблицы Edge {sourceID, ordinal}.Простой вариант подхода Edge должен хранить имена атрибута в отдельной таблице.
2.7.2.2 Подход Атрибута
В этом методе, всеми атрибутами с тем же самым именем была группа в одну таблицу. Этот подход соответствует горизонтальному разделению таблицы Edge, используемой в первом подходе, использование имени как атрибут разделения. Таким образом, там мы создаем так много таблиц атрибутов, имеет структуру:
A-имя (source, ordinal, flag, target )
Ключ такой таблицы атрибута - {source, ordinal}, и все поля имеет то же самое значение как в подходе Edge
3.Эксперименты/ результаты
Эксперимент проводился на Windows XP машина; RAM на 512 МБ 40Gb Жесткий диск. Программное обеспечение: Oracle 10g и SQL Server 2005 используются. База данных от XMark и вопросов, случайных от 20 вопросов XMark, и я дала некоторые вопросы для сравнения разных методов.
3.1 Сравнение разных методов
3.1.1 Время погрузки данных
SQL Server (s) | Oracle (s) | |
Тип XML данных | 197 | 87s |
XQuery | 200 | 100 |
DTD подход | 518400 | -- |
Edge подход | 432000 | -- |
Видим в таблицу, мы получим: Два метод DTD подход и Edge подход, в которых надо выбрать данные из XML данных и потом вставить в таблицу, поэтому время погрузки данных медленнее, чем много раз подходов Тип XML данных и XQuery, которые только вставить в одну строку таблицы. В DTD подход, поскольку в каждый тэг надо создать соответствующую таблицу и в Edge подход все данные только создать одну таблицу, поэтому время погрузки данных быстрее чем, DTD подхода.
В Oracle, время чтобы загрузить данных в таблицы надо много времени, поэтому я не проводила эксперимент DTD поход и Edge подход в Oracle.
3.1.2 Память хранения данных из 110Mb XML данных
SQL Server (Mb) | Oracle (Mb) | |
Тип XML данных | 172.2 | 140 |
XQuery | 172.2 | 140 |
DTD подход | 230 | -- |
Edge подход | 210 | -- |
Из таблицы, мы видим так, в DTD подходе и Edge подходе мы храним данные в таблицы с много строк, которые нужны дополненная память для индекса. В тип XML данных и XQuery подходах только хранятся в одну строку, поэтому память хранения данных DTD и Edge подходов много чем, тип XML данных и XQuery.
3.1.3 Время выполнения запросов
В этом эксперименте, я сделала DTD и Edge подходы только в узел person поэтому запросы я не использовала запросы из XMark, а я сама думала запросы. И запросы такие:
Q1: Выбрать люди, которые имеют ordinal равно 100
Q2: Выбрать люди, которые не имеют homepage
Q3: Найти все люди.
Q4: Найти имя, адрес всех людей, которые имеют zipcode равно 22
Q5: Выбрать имя, age, пол, income людей, которые имеют open_auction равно 6634
Q6: Найти сумм всех людей, у которых есть income > =100
Q7: Выбрать имя, улицы, город, страна людей, у которых имеют education =”College”
Q8: Найти людей, у которых есть телефон и пол «female»
Q9: Найти сумм всех женских
Q10: Выбрать имя, пол, education людей, у которых есть creditcard
Время выполнения:
Query | SQL Server | Oracle | ||||
Тип XML | XQuery | DTD | Edge | Тип XML | XQuery | |
Q1 | 23 | 20 | 2 | 2 | 1543 | 2956 |
Q2 | 12 | 19 | 1 | 1 | 1666 | 7873 |
Q3 | 20 | 30 | 3 | 3 | 2416 | 6265 |
Q4 | 2500 | 35 | 1 | 3 | 1308 | 8157 |
Q5 | 15 | 20 | 2 | 8 | 7065 | 7515 |
Q6 | 2550 | 65 | 0.5 | 6 | 2325 | 8115 |
Q7 | 2200 | 44 | 1 | 7 | 2453 | 6315 |
Q8 | 2600 | 70 | 1 | 2 | 2154 | 7265 |
Q9 | 1000 | 28 | 4 | 15 | 3421 | 5437 |
Q10 | 200 | 22 | 2 | 10 | 4325 | 7125 |
Из результатов, мы видим что: