2011年1月12日 星期三

Database in Depth筆記-2(Predicate)

關係與關係變數

關係變數(用R表示)跟程式語言的變數一樣,是可以放置某種型別(這裡是關係)的容器。而關係(用r表示),則是指在某個時點,實際存在的n個Tuples(n>=0)。以C.J. Date的觀點,所謂Relation Model的Insert、Delete、Update動作,都是透過關係變數R,取出所要的關係後,對其Tuple進行一些處理後,再重新指向回關係變數。

Predicate

Predicate的觀念是由集合論而來的。在指涉某個集合時,常常無法透過列出集合中包含的所有元素的方式,來表示該集合。因此改以使用用該集合中每個元素的共同因子作為參數來描述該集合。對應至Relational Model,組成關係變數Heading中的屬性集合,即可組成描述該關係變數的Predicate。例如某個關係變數 R的Heading為 {Customer_ID,Customer_Name,Customer_Address},其意含可以解釋為這樣的Predicate:  編號為Customer_ID的客戶,其名稱為 Customer_Name,且其住址為Customer_Address

將Assign到該關係變數的關係r中的每一Tuple的值,分別套上這個Predicate的結果後,就形成一個Proposition(命題)。此命題應該都為True,因為若結果為False,則此關係根本不存在,也就不會被Assign到關係變數中。所以C.J. Date提到一個重點:在EF Codd原始的Relational Model中,資料庫不是資料的集合,而是Proposition(命題),則事實的集合。系統執行關聯式運算的過程,就是由既有事實推論出新的事實

Database in Depth筆記-1 (Relation及Tuple定義)

Database in Depth: Relational Theory for Practitioners

這本書買了好幾年了,因為讀起來有點艱澀,一直沒有把它翻完(作者太龜毛了,一直在辨證Relational Model不能有NULL、SQL不是Relational Model之類對我來說沒有意義的論點),不過看在它是和EF Codd一起work on Relational Model的大師,還是應該把它翻過一遍,趁這次再翻它的機會,做一些筆記。

Tuple定義:

相對應於Table的Row。在原始的Relational Model中,是用Tuple這個概念來代表一組資料,而不是大家所熟知的Row。以下是它的定義:

假設T1,T2…,Tn(n>=0)是型別的名稱,而A1,A2…,An是代表n個不同的屬性名稱,若將每個屬性名稱Ai對應到相對的Ti型別,則如此組合成的每一個屬性名稱:型別 (Ai:Ti)就是一個屬性。若將每個屬性都賦予符合型別Ti的值Vi,則形成的屬性:值,就稱為一個Component。如此一來,n個屬性:值組成的n個Component的集合就稱為一個Tuple。而這n個Component中的屬性集合就形成讓Tuple的Heading,以集合{H}表示

Relation定義:

相當於RMDBS的Table。初學Relational Model的人可能會把關聯式資料庫的關聯想成是不同Table之間可以建立Join的關係。然而,在原始的Relational Model,Relation是較為抽象的定義。它是基於集合論而來的概念。假設Order Table有CustomerID及ProductID這兩個屬性,把CustomerID和ProductID這兩個屬性放到同一個實體來看,就是Relation的意義了。以下是CJ Date在此書中所下的定義

假設{H}是Tuple的Heading,而且t1,t2…,tm (m>=0)是帶Heading {H}的不同Tuple,則該Heading {H}與該不同Tuple的集合(t1,t2…,tm)的組合叫做Relation。此Relation就是帶有屬性A1,A2…An的關係,換句話說,該Relation的Body就是Tuple(t1,t2…,tm)的集合

1NF(一階正規化)

有了Relation及Tuple的觀念後,一階正規化就可以簡單用一句話來描述:每個Tuple的每一個屬性只能帶有單一值

2011年1月6日 星期四

使用JAXB Parse XML

轉載自:http://www.javaworld.com.tw/jute/post/view?bid=19&id=5482&sty=1&tpg=1&age=-1

相信正常一點的程式設計人員都覺得XML很煩
如果你是技術狂,那就算了,當我沒說 :p
通常我們只是想要讀一個能跨平台的文件
幹嘛要去了解一堆有的沒的定義及如何parse文件的東東
為什麼不讓這些煩人的事情包裝起來
我們只要關心我讀進來的資料該如何處理
處理完再把它順利的寫回就好哩
這個念頭相信在大家的心中都出現過
所以恭喜大家,前人已經幫我們種好樹了
大家趕快到樹下乘涼吧
JAXB就是我們要的東東
Java Architecture for XML Binding (JAXB)
簡單的講就是提供了一個自動在xml文件與java物件mapping的機制
所以我們不用去了解啥米弟踢弟、死雞碼該如何定義
也不用學習如何去吹薩克斯風或挖洞給自已跳
首先要下載Java Web Services Developer Pack
其中便包含有JAXB的實作套件
接下來要設定相關的環境變數
範例如下:
set JAVA_HOME=your_jdk_home_path
set JWSDP_HOME=your_jwsdp_home_path
set JAXB_HOME=%JWSDP_HOME%\jaxb-1.0
set JAXB_LIBS=%JAXB_HOME%\lib
set JAXP_LIBS=%JWSDP_HOME%\jaxp-1.2.2\lib
set JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib
set PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdpshared\bin;%PATH%
以下請自行連結為一行
set CLASSPATH=%JAXB_LIBS%\jaxb-api.jar;
%JAXB_LIBS%\jaxb-ri.jar;%JAXB_LIBS%\jaxb-xjc.jar;
%JAXB_LIBS%\jaxb-libs.jar;
%JAXP_LIBS%\jaxb-api.jar;
%JAXP_LIBS%\endorsed\xercesImpl.jar;
%JAXP_LIBS%\endorsed\xalan.jar;
%JAXP_LIBS%\endorsed\sax.jar;
%JAXP_LIBS%\endorsed\dom.jar;
%JWSDP_LIBS%\jax-qname.jar;
%JWSDP_LIBS%\namespace.jar;.;
接下來我們一步步來看該如何使用JAXB
首先要先綁架xml schema
透過JAXB所提供的工具xjc
可產生一組用以描述xml schema的Java介面及實作類別
xjc指令格式如下:
xjc -p <generated_package> -d <target_directory> xml_schema
例如:
xjc -p test.jaxb -d work_area books.xsd
接著要編譯所產生的介面及實作類別
javac test/jaxb/*.java test/jaxb/impl/*.java
再來就可試著透過Unmarshal的方式來取得xml文件裡的資料
可以在測試程式中撰寫類似以下程式碼
JAXBContext jc = JAXBContext.newInstance("test.jaxb");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Collection collection =
(Collection)unmarshaller.unmarshal(new File( "books.xml"));
CollectionType.BooksType booksType = collection.getBooks();
List bookList = booksType.getBook();
然後就可以取出xml文件裡的資料
for( int i = 0; i < bookList.size();i++ ) {
test.jaxb.BookType book =(test.jaxb.BookType) bookList.get(i);
System.out.println("Item id: " + book.getItemId());
System.out.println("Book Name: " + book.getName().trim());
}
另外也可利用
unmarshaller.setValidating(true);
來指定是否要在Unmarshal的同時來驗證此份xml文件格式正確與否
再來就可試著透過Marshal的方式來將資料寫到所指定的xml文件裡
可以在測試程式中撰寫類似以下程式碼
JAXBContext jaxbContext = JAXBContext.newInstance("test.jaxb");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT ,
new Boolean(true));
ObjectFactory objFactory = new ObjectFactory();
Collection collection= (Collection) objFactory.createCollection();
Collection.BooksType booksType = objFactory.
createCollectionTypeBooksType();
List bookList = booksType.getBook();
BookType book = objFactory.createBookType();
book.setItemId("777");
book.setName("JAXB簡介");
然後就可以將資料寫入我們所指定的xml文件裡
bookList.add(book);
collection.setBooks(booksType);
marshaller.marshal(collection,
new FileOutputStream("jaxb_test.xml"));
另外也可利用Validator類別來驗證此份xml文件格式正確與否
範例如下:
Validator validator = jaxbContext.createValidator();
validator.validate(collection));
若您還想知道更多關於JAXB使用上的細節,請上官方網站喔 ^_^
http://java.sun.com/xml/jaxb/
*********************無版權宣告*********************
版權沒有,歡迎轉載
轉載時請保留作者姓名及此份宣告
本文是為了方便新手入門學習
歡迎大家給小弟指正或補充更多詳盡的資料
my email: iampoya@pchome.com.tw
本文同步刊於
http://www.javaworld.com.tw
http://www.midicat.com/poya/ezjava