用 IBM Rational XDE Developer for Java 為 DB2 UDB 數(shù)據(jù)
2024-09-06 23:58:04
供稿:網(wǎng)友
英文原文
用 ibm rational xde developer for java 為 db2 udb 數(shù)據(jù)庫建模
enter a subtitle
suita gupta([email protected]),developer technical support,ibm
nanda pilaka([email protected]),developer technical support,ibm
2004 年 6 月
內(nèi)容 簡介 開始之前 為數(shù)據(jù)庫和表空間建模 表及其關(guān)系
視圖
存儲過程 觸發(fā)器 基于數(shù)據(jù)模型生成 ddl 腳本 連接數(shù)據(jù)庫 逆向工程 比較和同步模式 結(jié)束語
簡介
參與數(shù)據(jù)庫應(yīng)用程序開發(fā)的每一個人都遵循著某套方法。而您所選擇的方法將幫助您分析需求,以及開發(fā)和交付最終的產(chǎn)品。這套方法中最重要的部分就是,基于業(yè)務(wù)需求的數(shù)據(jù)庫設(shè)計和建模。在這篇文章中,我將談?wù)撌褂?#8220;rational® xde developer for java”進行的,專門針對“db2® universal database”的設(shè)計和建模!
統(tǒng)一建模語言(uml)是用于為業(yè)務(wù)和軟件應(yīng)用需求建模的標(biāo)準(zhǔn)的圖形化表示法。過去的幾年里,已經(jīng)開始廣泛地將 uml 用于面向?qū)ο蟮能浖_發(fā)中。除了適用于為對象建模之外,uml 還適用于設(shè)計和建立數(shù)據(jù)存儲模型,以供您的應(yīng)用程序使用?;旧?,數(shù)據(jù)建模包括分析客戶需求,用以開發(fā)一個客戶的數(shù)據(jù)需求模型,然后,以該模型為藍圖或架構(gòu)為應(yīng)用程序構(gòu)建數(shù)據(jù)庫。
本文將向您展示基于已熟悉的 db2 sample 數(shù)據(jù)庫來生成一個數(shù)據(jù)庫模型是多么容易。在文章的末尾,您將看到如何為 db2 sample 數(shù)據(jù)庫及其中的一些數(shù)據(jù)對象建模。我們還將向您展示如何從已完成的模型生成 ddl 腳本,以及如何使用這些腳本來創(chuàng)建最終的 db2 數(shù)據(jù)庫。
我們將使用 rational xde developer for java(版本:2003.06.00)和 ibm db2 universal database v8.1 進行建模。rational xde 支持遵循 ansi sql 92 標(biāo)準(zhǔn)的從 v5.2 開始的所有 db2 udb 版本和 db2 for os/390® 5.x、6.x、7.x 的數(shù)據(jù)建模。rational xde 也可以用于為 oracle、sybase 和 sql server 數(shù)據(jù)庫建模。
數(shù)據(jù)建模的好處
數(shù)據(jù)建模有許多優(yōu)點,可以使開發(fā)小組中的數(shù)據(jù)設(shè)計師和管理員以及所涉及的程序員均從中受益。
數(shù)據(jù)庫設(shè)計師可以使用 rational xde 等工具來建立和可視化數(shù)據(jù)庫模型,確保數(shù)據(jù)庫規(guī)則,添加不同的數(shù)據(jù)庫對象,并設(shè)置關(guān)系。 數(shù)據(jù)庫管理員既可以為一個已經(jīng)存在的數(shù)據(jù)庫創(chuàng)建模型,也可以從模型生成 ddl 并為特定的實現(xiàn)創(chuàng)建數(shù)據(jù)庫。 數(shù)據(jù)模型有助于應(yīng)用程序開發(fā)人員更好地理解應(yīng)用程序的總體架構(gòu),盡管一般說來,他們不需要深入了解數(shù)據(jù)庫體系結(jié)構(gòu)的細節(jié)。他們可以用數(shù)據(jù)模型來建立類模型,例如由表結(jié)構(gòu)產(chǎn)生。 數(shù)據(jù)模型對于終端用戶也十分有用,可驗證是否已準(zhǔn)確地捕獲所有的數(shù)據(jù)需求。
如果項目中的所有建模都是用 uml 完成的,那么該數(shù)據(jù)模型將完全匹配其余的系統(tǒng)設(shè)計,并且?guī)椭麄€小組無縫地協(xié)同工作。
開始之前
在開始創(chuàng)建數(shù)據(jù)庫模型之前,讓我們來看一個 rational xde 的屏幕快照,以及我們將用于建立數(shù)據(jù)庫模型的菜單和選項,如 圖 1 所示:
圖 1. 從 rational xde 開始
我們需要為數(shù)據(jù)模型創(chuàng)建一個項目。單擊 file -> new -> project。選擇創(chuàng)建 data modeling project 并命名為“data model”。一旦創(chuàng)建了該項目,您就可以在 model explorer 窗格上看到它了,如下面的 圖 2 所示。
其中,已經(jīng)為您創(chuàng)建了兩個模型 —— 一個物理數(shù)據(jù)模型和一個邏輯數(shù)據(jù)模型。數(shù)據(jù)架構(gòu)師和數(shù)據(jù)庫設(shè)計師通常使用邏輯數(shù)據(jù)模型,以一種獨立于特定數(shù)據(jù)庫實現(xiàn)的形式捕獲數(shù)據(jù)需求。邏輯模型是用于與業(yè)務(wù)風(fēng)險承擔(dān)者(stakeholder)進行通信以確保清晰地捕獲數(shù)據(jù)需求的好工具,因為它沒有牽扯到特定數(shù)據(jù)庫的細節(jié)。數(shù)據(jù)庫設(shè)計師通常將邏輯模型細化為一個或多個“范式”,以便消除數(shù)據(jù)重復(fù)和提高最終設(shè)計的質(zhì)量。一旦對邏輯數(shù)據(jù)需求的準(zhǔn)確性有了十足把握,您就可以將該邏輯模型轉(zhuǎn)換為物理數(shù)據(jù)模型,從而將該模型匹配特定的目標(biāo)數(shù)據(jù)庫。然后,可以針對特定的數(shù)據(jù)庫系統(tǒng)或應(yīng)用程序,改進和優(yōu)化該物理數(shù)據(jù)模型。
邏輯數(shù)據(jù)模型的使用不屬于本文的討論范疇。接下來,我們將關(guān)注物理數(shù)據(jù)模型層次上的數(shù)據(jù)庫設(shè)計。
圖 2. model explorer
為數(shù)據(jù)庫和表空間建模
首先,我們將創(chuàng)建數(shù)據(jù)庫模型。正如您將在下面 圖 3 中看到的,數(shù)據(jù)庫是可以進行建模以及在數(shù)據(jù)模型中用 uml 符號 <<database>> 表示的最大元素。rational xde 允許您選擇任何一種它所支持的 dbms 作為數(shù)據(jù)模型的實現(xiàn)數(shù)據(jù)庫。本文中,我們選擇了 db2 udb v8 來演示數(shù)據(jù)建模的過程。
創(chuàng)建數(shù)據(jù)庫組件
在 model explorer 中,右擊 main ->add data modeler ->database。
圖 3. 創(chuàng)建數(shù)據(jù)庫模型
然后,單擊 model explorer 中新創(chuàng)建的數(shù)據(jù)庫組件,輸入一個名稱。我們將 sampledb 作為我們數(shù)據(jù)庫的獨有名稱。
右擊 model explorer 中的 sampledb,并單擊 data modeler -> open specification。
圖 4. 打開 specification
在 database specification 對話框中,在 database 列表中選擇 ibm db2 8.x 作為目標(biāo)數(shù)據(jù)庫。
圖 5. 選擇目標(biāo)數(shù)據(jù)庫
單擊 ok,并將該數(shù)據(jù)庫組件拖放到 diagram 視圖上。
rational xde 允許您建立表空間模型,并將表指派到這一表空間。我們將看到如何建立一個名為 sample_tbsp 的、已分配一個容器的表空間模型。請注意,您在以下步驟中指定的容器路徑應(yīng)該已經(jīng)存在。
在進一步繼續(xù)之前,您可以通過右擊 model explorer 中的 logical data model 來選擇邏輯數(shù)據(jù)模型。您可以隨時使用熱鍵 ctrl+s 保存您的模型。
創(chuàng)建表空間
在 model explorer 中,右擊數(shù)據(jù)庫后單擊 add data modeler -> tablespace。
圖 6. 添加表空間
在 model explorer 中,右擊新的表空間并單擊 data modeler -> open specification。
在 general 選項卡中,輸入表空間的名稱,例如 sample_tbsp。您還可以指定其他細節(jié),例如表空間的類型、擴展塊大小、預(yù)取大小、頁面大小以及緩沖池名稱。
圖 7. 表空間的具體指定
完成后,單擊 ok 并將這個表空間組件拖放到 diagram 視圖上。您一旦建立了數(shù)據(jù)庫模型和表空間模型,rational xde 就會自動地創(chuàng)建數(shù)據(jù)庫和表空間之間的依賴關(guān)系,如下面圖 8 所示:
圖 8. 依賴關(guān)系
創(chuàng)建容器
在 model explorer 中,右擊一個表空間后單擊 data modeler -> open specification。
在 container 選項卡中,單擊 new 圖標(biāo),并輸入新容器的路徑名稱。
圖 9. 定義容器
檢查點:您的模型現(xiàn)在應(yīng)該如 圖 10 所示:
圖 10. 此時的模型
表及其關(guān)系
我們將為原有的 sample 數(shù)據(jù)庫中的兩個表(employee 表和 department 表)建模。我們還將為這兩個表之間的參照完整性關(guān)系建模。
創(chuàng)建表組件的步驟:
在 model explorer 中,右擊數(shù)據(jù)模型,然后單擊 add data modeler ->table。 在 table specification 對話框的 general 選項卡中,指定表名稱,并在 columns 選項卡中添加該表的列。您還可以為該表指定主鍵。
圖 11. 給模型添加一個表
單擊 ok,您將在 model explorer 中看到這個表組件。將之拖放至 diagram 視圖上。
我們將分別為 employee 表和 department 表執(zhí)行以上步驟。對于 employee 表,我們將省略“workdept”列的創(chuàng)建。在我們建立 employee 表和 department 表之間的參照完整性時,將自動為我們創(chuàng)建該列。
現(xiàn)在,我們將建立 employee 表(外鍵:workdept)和 department 表(主鍵:deptno)之間的參照完整性。可以通過創(chuàng)建這兩個表之間的“identifying”關(guān)系來完成:
從工具箱的 data modeler 列表中選擇 identifying relationship 選項,然后先單擊 diagram 視圖上的父表 department 組件,再單擊子表 employee 組件。
圖 12. 設(shè)置參照完整性
在 relationship specification 對話框中,您可以指定子角色和父角色。
圖 13. 關(guān)系的具體指定
在 relationship specification 對話框的 migrated keys 選項卡中,您還可以修改 employee 表中的外鍵列名稱:
圖 14. migrated keys
您將看到 employee 表中添加了一個新的列。在 table specification 對話框的 column 選項卡中,您可以修改“workdept”列在 employee 表中的位置,如下面 圖 15 所示:
圖 15. table specification 對話框
您的模型應(yīng)該與下面 圖 16 所示相類似:
圖 16. 模型
視圖
rational xde 允許您基于表或 sql 查詢來創(chuàng)建視圖。這些查詢可以包括 where、group by 或 order by 子句。您既可以手工為視圖指定 sql 查詢,也可以在 view specification 對話框中為視圖選擇各個列。
以下是創(chuàng)建視圖組件的步驟:
在 model explorer 中,右擊模型后單擊 add data modeler -> view。一個新的視圖將顯示在 model explorer 中。 右擊這個新的視圖,然后單擊 data modeler > open specification。這將打開 view specification 對話框。 在 general 選項卡中,在 name 框中輸入“emp_view”作為視圖名稱。 單擊 ok 并將該視圖組件拖放至 diagram 視圖上。
為該視圖指定列:
從工具箱的 data modeler 列表中選擇 view dependency,然后先單擊圖(diagram)上的 view 組件(emp_view),再單擊源表組件(employee 表)。
圖 17. 創(chuàng)建視圖
源表中的所有列都將填充到您的視圖中。 此時,您可以通過啟用 view specification 對話框的 general 選項卡中的“user defined”復(fù)選框,為視圖指定定制的 sql 查詢:
圖 18. 視圖的具體指定
然后在同一對話框的 sql 選項卡中輸入定制的 sql 查詢。完成后單擊 ok。
圖 19. 視圖的具體指定
存儲過程
rational xde 還允許您為數(shù)據(jù)庫建立存儲過程的模型。所支持的 dbms 有:
ibm db2 udb 5.2、6.1、7.0 和 8.0 ibm db2 mvs 5.x、6.x 和 7.x oracle 7.3、8.x、和 9i for windows nt microsoft sql server 6.5、7.0 和 2000 sybase adaptive server 12.x
在 rational xde 中,術(shù)語“存儲過程”包括常規(guī)的存儲過程(返回多個結(jié)果)和存儲函數(shù)(返回標(biāo)量值)。這兩種存儲過程都可以用相應(yīng)的參數(shù)和一個動作體(action body)來進行定義和建模。
可是,請牢記數(shù)據(jù)庫和存儲過程之間必須存在 實現(xiàn)關(guān)系(realization relationship),才能對目標(biāo)數(shù)據(jù)庫執(zhí)行 ddl。在 rational xde 中,存儲過程在存儲過程容器中被分組。在為該模型生成 ddl 之前,需要通過實現(xiàn)關(guān)系將表、存儲過程和視圖指派給該數(shù)據(jù)庫。
創(chuàng)建存儲過程組件的步驟:
在 model explorer 窗口中,右擊 main。 選擇 add data modeler 并單擊 stored procedure container。這將在數(shù)據(jù)模型中創(chuàng)建一個默認(rèn)名為“procedurecontainer1”的存儲過程容器。 您可以使用該容器默認(rèn)的名稱,也可以通過位于 model explorer 窗口之下的 properties 窗口修改它。 右擊存儲過程容器“procedurecontainer1”,然后,選擇 add data modeler 并單擊 stored procedure。這將添加默認(rèn)名為“procedure1”的存儲過程容器。同樣地,您可以使用這個默認(rèn)名稱,如果希望,也可以通過 model explorer 窗口之下的 properties 窗口來提供另一名稱。 您還必須添加從數(shù)據(jù)庫到存儲過程的“數(shù)據(jù)庫實現(xiàn)”關(guān)系,用以為該存儲過程生成 ddl。 為了添加“數(shù)據(jù)庫實現(xiàn)”關(guān)系,單擊工具箱中的 data modeler,下滾該列表至“database realization”,單擊選擇它。 然后,先單擊數(shù)據(jù)庫組件,接著再單擊存儲過程容器組件以創(chuàng)建實現(xiàn)關(guān)系。該數(shù)據(jù)模型將如下面 圖 20 所示:
圖 20. 展示了實現(xiàn)關(guān)系的數(shù)據(jù)模型
此時或稍后,可以通過右擊 model explorer 中的存儲過程,選擇 data modeler 并單擊 open specification,來修改存儲過程的名稱和簽名(參數(shù)等等)。 這將打開 stored procedure specification 對話框。 在該對話框中,您可以通過 general 選項卡修改過程名、編寫語言等,通過 parameters 選項卡添加參數(shù),以及最后通過 action body 選項卡指定一個動作體,如下面圖 21 所示:
圖 21. 存儲過程的具體指定
觸發(fā)器
xde 允許您創(chuàng)建用戶定義的觸發(fā)器,用以在數(shù)據(jù)庫中實施業(yè)務(wù)規(guī)則。
為觸發(fā)器建模:
在 model explorer 中右擊所需的表。 選擇 data modeler 并單擊 open specification 以打開該表的具體指定(specification)。 在 specification 對話框中,單擊 triggers 選項卡,然后單擊 new,為該表建立一個新的觸發(fā)器模型。 您可以創(chuàng)建一個“after”或“before”觸發(fā)器,以及為該觸發(fā)器創(chuàng)建一個動作體。下面的 圖 22 說明了是如何進行的:
圖 22. 創(chuàng)建觸發(fā)器
基于數(shù)據(jù)模型生成 ddl 腳本
rational xde 提供了 forward engineering 向?qū)?,用以為整個數(shù)據(jù)庫或數(shù)據(jù)模型中的指定組件生成數(shù)據(jù)定義語言(ddl)腳本。rational xde 生成的 ddl 遵循 ansi sql 92 標(biāo)準(zhǔn)。xde 還允許您對目標(biāo)數(shù)據(jù)庫執(zhí)行所生成的 ddl,而目標(biāo)數(shù)據(jù)庫是您在啟動數(shù)據(jù)模型項目之前指定的。因此,要確保您已經(jīng)正確連接了該目標(biāo)數(shù)據(jù)庫。同時,該數(shù)據(jù)模型中的所有數(shù)據(jù)庫組件都必須利用前面小節(jié)中所闡明的關(guān)系連接該數(shù)據(jù)庫組件。如果沒有為任何組件進行該工作,那么就不會為特定的組件生成 ddl。
為了生成 ddl 腳本:
在 model explorer 中,右擊一個現(xiàn)有的數(shù)據(jù)庫、包或表,然后單擊 data modeler > forward engineer。這將打開用于數(shù)據(jù)建模的 forward engineering wizard 對話框。然后按照該向?qū)е械闹甘具M行。下面的圖 23 是通過 forward engineering 向?qū)檎麄€數(shù)據(jù)庫生成 ddl 的屏幕快照:
圖 23. forward engineering 向?qū)?br>
連接數(shù)據(jù)庫
rational xde 允許您連接一個 dbms,并且執(zhí)行所生成的 ddl 以創(chuàng)建數(shù)據(jù)庫對象。所支持的 dbms 有:
ibm db2 udb 5.2、6.1、7.0 和 8.0 ibm db2 mvs 5.x、6.x 和 7.x oracle 7.3、8.x 和 9i for windows nt microsoft sql server 6.5、7.0 和 2000 sybase adaptive server 12.x rational xde 支持下列用以連接以上數(shù)據(jù)庫系統(tǒng)的驅(qū)動程序:
ibm db2 app driver(odbc) ibm db2 udb jdbc driver oracle ole db provider oracle thin jdbc driver ole db provider ms ole db for odbc ms ole db for oracle(mdac) ms sql ole db provider sybase ase odbc driver為了連接目標(biāo)數(shù)據(jù)庫,您必須將之配置成 odbc 數(shù)據(jù)源,并提供正確的訪問信息以便能夠連接它。既可以將該數(shù)據(jù)庫配置為系統(tǒng) odbc 數(shù)據(jù)源,也可以配置為用戶 odbc 數(shù)據(jù)源。您既可以通過 forward engineering 或 reverse engineering 向?qū)Ы⑦B接,也可以在比較和同步(compare and sync)模式[rlk1]下進行。還請注意,如果選擇連接數(shù)據(jù)庫,您可能需要為所選擇的數(shù)據(jù)庫系統(tǒng)安裝運行時客戶機(對于 db2 udb)或等效的客戶機組件(對于其他的 dbms)。關(guān)于這方面的更多信息,請查看 rational xde 幫助??梢詼y試到目標(biāo)數(shù)據(jù)庫的連接,例如在 forward engineering 向?qū)е型ㄟ^ execute 復(fù)選框進行,如下面的圖 24 所示:
圖 24. 連接數(shù)據(jù)庫
逆向工程
我們已經(jīng)介紹了正向工程(forward engineering)。通過逆向工程(reverse engineering),我們可以為已經(jīng)存在的數(shù)據(jù)庫建立模型。這將允許我們修改該模型,例如添加表、存儲過程、觸發(fā)器等,然后通過生成和執(zhí)行被修改模型的 ddl 來進行正向工程(forward engineer)。
對數(shù)據(jù)庫進行逆向工程:
在 model explorer 中,右擊該數(shù)據(jù)模型并單擊 data modeler -> reverse engineer。這將打開 reverse engineering 向?qū)А?按照向?qū)е械闹甘具x擇數(shù)據(jù)庫以及逆向工程過程中所包含的所有元素。
比較和同步模式
rational xde 中的比較和同步(compare and sync)功能用于確保數(shù)據(jù)模型與所生成的 ddl 或目標(biāo)數(shù)據(jù)庫一致。比較和同步不包括圖和比較模型之間的關(guān)系。在比較數(shù)據(jù)模型和數(shù)據(jù)庫以及使之同步之前,請驗證已經(jīng)正確連接數(shù)據(jù)庫,并且正確登錄,口令無誤。
將數(shù)據(jù)模型與 ddl 文件或數(shù)據(jù)庫進行比較并使之同步
在 model explorer 或圖中,右擊一個現(xiàn)有的數(shù)據(jù)庫,然后單擊 data modeler > compare and sync。 這將打開數(shù)據(jù)模型的 database synchronization wizard。按照向?qū)е械闹甘具M行。 關(guān)于比較和同步功能,要記住以下幾點: 如果將逆向工程所生成的數(shù)據(jù)模型與 ddl 進行比較,您就必須將 owner/schema 屬性重新設(shè)置為您進行逆向工程的模式名。對于比較中包含的每個數(shù)據(jù)模型元素,您都必須完成該設(shè)置。 您應(yīng)將需要在比較和同步中包含的所有元素指派給數(shù)據(jù)模型數(shù)據(jù)庫。在比較過程中,xde 會忽略所有未指派給數(shù)據(jù)模型數(shù)據(jù)庫的元素。 您的數(shù)據(jù)模型數(shù)據(jù)庫必須使用與所比較的 ddl 或 dbms 數(shù)據(jù)庫相同的名稱和目標(biāo)數(shù)據(jù)庫。 如果將您數(shù)據(jù)模型中的視圖和 ddl 中的視圖進行比較,ddl 就必須使用全限定名,尤其是在該視圖的 sql 語句中。如果該 ddl 未使用全限定名,那么這些視圖在比較過程中看起來就不同,而您就必須手工查看每個視圖的 sql 語句,以發(fā)現(xiàn)真正的語法差別。
結(jié)束語
最后,下面的 圖 25 展示了我們的測試項目“data model1”現(xiàn)在的數(shù)據(jù)庫模型。
圖 25. 數(shù)據(jù)庫模型
最后,我們概述了使用 rational xde 進行數(shù)據(jù)庫建模的過程,但沒有討論太多細節(jié),以免使初級用戶無法承受。這個簡單示例已經(jīng)為您開了個頭,您可以開始使用該工具來滿足您自己的數(shù)據(jù)庫設(shè)計和建模需求。要獲得該產(chǎn)品的更多信息,請從 help 菜單查看 rational xde 的在線幫助。
注意
forward engineering 向?qū)丛?ddl 文件中插入或生成數(shù)據(jù)庫 ddl(create database 命令)。這意味著在對目標(biāo)數(shù)據(jù)庫執(zhí)行 ddl 腳本之前,需要手工創(chuàng)建目標(biāo)數(shù)據(jù)庫。 本文采用的 rational xde 版本為 2003.06.00。在建立存儲過程模型時,您可能會發(fā)現(xiàn)如果在存儲過程具體指定的 action body 選項卡中指定了一個動作體,該存儲過程的 ddl 中卻沒有這個動作體。該缺陷在 2004 年 4 月 9 日發(fā)布的 service release 2(fixpack 2)中得到了修復(fù)。關(guān)于當(dāng)前修正版的更多信息,請查看 www.rational.com。 在為 db2 存儲過程指定動作體時,必須使用非傳統(tǒng)的 sql 語句終止字符,例如“@”等,因為分號在存儲過程體中用于終止存儲過程動作語句。然而,在通過 forward engineering 向?qū)纱鎯^程 ddl 時,會在“@”后面額外生成一個分號,所以“@”是不需要的,否則 db2 的 sql 編譯器會發(fā)出錯誤。 可能需要編輯所生成的 ddl 腳本,以確保所使用的語句終止字符是正確的。
到頁首
resources
subgroup of resourcesexplanation of what the resources will provide for the developer. and then list the resources: title of resource title of resource -->
關(guān)于作者
suita gupta 是 websphere competency center 小組的技術(shù)支持代表。她具有應(yīng)用程序開發(fā)和管理方面的 db2 認(rèn)證。在 websphere 支持小組工作之前,她在 developer relations db2 technical support 小組中研究各種 db2 應(yīng)用程序的開發(fā)和管理問題。您可以通過 [email protected] 與 suita 聯(lián)系。
nanda pilaka 是德克薩斯州達拉斯 content manager business partner support 小組的軟件工程師。他具有應(yīng)用程序開發(fā)和管理方面的 db2 認(rèn)證。在 content manager 支持小組工作之前,他在 ibm 達拉斯的 developer relations db2 technical support 小組中研究各種 db2 應(yīng)用程序的開發(fā)和管理問題。您可以通過 [email protected] 與 nanda 聯(lián)系。
菜鳥學(xué)堂: