Power Designer:數據庫表設計工具
PowerDesigner是Sybase公司的一款軟件,使用它可以方便地對系統進行分析設計,他幾乎包括了數據庫模型設計的全過程。利用PowerDesigner可以制作數據流程圖、概念數據模型、物理數據模型、面向對象模型。今天的課程講用Power Designer來做物理數據模型,即進行數據庫表設計。
在項目設計階段通常會使用PowerDesigner進行數據庫設計。使用PowerDesigner可以更加直觀的表現出數據庫中表之間的關系,並且可以直接把設計好的表導出相應的建表語句。
1、Power Designer使用(創建PDM)
File-->new-->Physical Data Model-->給Model name起名pd_test-->DBMS中選擇MYSQL5.0-->確定
快捷鍵:alt+0,顯示左側列表
Pd_test右鍵-->new-->table-->name是說明性的文字,真正的表名是通過code來看的,兩個一樣也可以。給name取值為“用戶表”,給code取值為“t_user” -->Columns-->添加字段,如果是主鍵則勾選P(primary key),varchar類型要指定長度,varchar類型選擇varchar(%n),,如果長度是11,則在length那一列填11,此時Data_type類型由varchar(0)變為varchar(11),int和Integer類型不用指定長度,name那一列寫中文名,code那一列寫字段名,-->設置主鍵自增:選中主鍵那一行,右鍵,選擇properties,點擊是,勾選Identity,它表示主鍵自增,點擊應用,點擊確定-->點擊確定,這樣就創建出一個用戶表
注意:如果不添加主鍵自增,將sql語句導入數據庫之后,要在設計表的時候,勾選“自動遞增”
快速創建表:在palette中點擊,單擊空白屏幕,雙擊表,修改表的信息。
添加外鍵約束:在t_order表中添加外鍵字段user_id,-->在palette中點擊,再單擊訂單表,按住不放拖動到用戶表,但是此時外鍵加到id上了-->雙擊中間連接的箭頭-->點擊Joins-->將子表的外鍵列由id修改為user_id-->確定,這樣user_id就變成了外鍵
2、Power Designer使用(導出SQL腳本)
點擊保存,可以保存為pdm文件,保存之后,雙擊該文件就可以打開powerDesigner
DataBase-->Generate DataBase-->Directory選C:\Users\ASUS\Desktop,File name選health_test-->確定-->close-->關閉Result list,此時桌面上已經生成sql文件-->打開Navicat的health數據庫-->將生成的sql文件拖動到health的白色區域-->點擊開始-->關閉-->在空白區域點擊右鍵,選擇刷新,發現數據庫表就生成了。
3、Power Designer使用(逆向工程)
上面我們是首先創建PDM模型,然后通過PowerDesigner提供的功能導出SQL腳本。實際上這個過程也可以反過來,也就是我們可以通過SQL腳本逆向生成PDM模型,這稱為逆向工程,操作如下:
File-->Reverse Engineer-->DataBase-->修改Model name為pd_2-->確定-->Selection-->add File-->選擇health_test.sql文件-->打開-->確定
4、Power Designer使用(生成數據庫報表文件)
通過PowerDesigner提供的功能,可以將PDM模型生成報表文件,
Report-->Report Wizard-->指定報表名稱和語言Simplified Chinese-->next-->next-->next-->完成-->保存-->是,這時會生成htm文件,
5、使用Power Designer創建表格注意事項:
1)、int和Integer類型不用指定長度。varchar類型要指定長度,varchar類型選擇varchar(%n)。
2)、mysql數據庫表字段命名規范:
(1)采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下划線'_'組成,命名簡潔明確,多個單詞用下划線'_'分隔
(2)全部小寫命名,禁止出現大寫
(3)字段必須填寫描述信息
(4)禁止使用數據庫關鍵字,如:time ,datetime, password 等
(5)字段名稱一般采用名詞或動賓短語。動賓短語示例:is_friend is_good,名詞 示例:user_id user_name sex
(6)采用字段的名稱必須是易於理解,一般不超過三個英文單詞
(7)在命名表的列時,不要重復表的名稱。例如,在名employe的表中避免使用名為employee_lastname的字段
(8)不要在列的名稱中包含數據類型
(9)字段命名使用完整名稱,禁止縮寫
待優化命名示例
①大小寫規則不統一
錯誤示例:user_id houseID
說明:使用統一規則,修改為”user_id”,”house_id”
②加下划線規則不統一
錯誤示例:username userid isfriend isgood
說明:使用下划線進行分類,提升可性,方便管理,修改為”user_name”,”user_id”,”is_friend”,”is_good”
③字段表示不明確
錯誤示例:uid pid
說明:使用完整名稱,提高可讀性,修改為”user_id”,”person_id”
3)、字段類型規范
(1)所有字段在設計時,除以下數據類型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、binary 、varbinary外,必須有默認值,字符型的默認值為一個空字符值串’’,數值型的默認值為數值0,邏輯型的默認值為數值0
(2)系統中所有邏輯型中數值0表示為“假”,數值1表示為“真”,datetime、smalldatetime類型的字段沒有默認值,必須為NULL
(3)用盡量少的存儲空間來存儲一個字段的數據。使用int就不要使用varchar、char,如手機號用int類型(數據庫設計過程中盡量使用int來作為字段類型,因為在所有的數據類型中int不管是存儲空間還是執行速度方面都是最好的。例如:如果業務中存儲的都是數據的話而且長度不是特別長的話,就可以考慮使用int來進行存儲,或者業務中要對數據進行排序的時候需要使用某一標識權重之類的,也可以使用int來進行存儲。但是不要因為int高效,而有意識的把所有字段都設計成int來處理,最終還是要根據業務的具體需求來設計相應的字段。當數據存儲的是字符,且長度是一個固定區間定值的話就可以考慮使用char來進行存儲,如果字符長度是未知的且長度變化特別明顯的話,這個時候最好使用varchar來存儲,如性別最好用char(1),當然也可以用varchar(1),建議'1'=男,'2'=女,''或者其他就是未知,小於10位且長度基本固定的字符串用char,長度大於10的用varchar,varcha在10以內占用空間比char大。char c='a'在內存中確實只占1字節,但這不意味着String s="abc"在內存中只占3字節。應該這么說,String s="abc"至少在內存中占3字節。這是因為char是基本數據類型,而String確是對象類型。對象是一種很復雜的數據類型,你要看一個對象具體占多少字節,可以把這個對象序列化后存入一個文本文件來看它具體占用了多少字節,當然這也不是精確的,因為序列化需要寫入少量系統信息,但大致是對的。varchar(10)和char(10)的差別是什么?存儲超過時候會發生什么問題呢?這個問題其實也相對經典,我也是整了很久才搞清楚的。在MYSQL5,5以后,varchar(x)x中范其實是存儲字段的長度范圍,就是一個字符代表一個長度,不管這個字符是漢子還是字符都算是一個長度單位。varchar雖然設置長度值,可是因為varchar是可變的長度類型,也就是當存儲的長度小於x時候,其實實際的存儲空間不是x而是實際存儲的字符長度+一些標示空間。當然如果超過x的長度的話還是會報錯的。而char(y)中y的值就是存儲空間實際的存儲長度,超過這個長度的話就會報錯)。用varchar(16)就不要使varchar(256);IP地址使用int類型;固定長度的類型最好使用char,例如:郵編(postcode);能使用tinyint就不要使用smallint,int(tinyint存儲大小為一個字節,smallint存儲大小為2個字節,int存儲大小為4個字節,年齡用tinyint就足夠了,tinyint可以表示0~255,用int就浪費了三倍空間。從性能的角度來說,用int會更好點,(int是4字節,剛好是計算機的字長)。從空間的利用上,是該用tinyint,只是,現在的空間不值錢,一般很少會考慮到這個需求了。個人覺得最好用tinyint);最好給每個字段一個默認值,最好不能為null
(4)用合適的字段類型節約空間。如:字符轉化為數字(能轉化的最好轉化,同樣節約空間、提高查詢性能)。避免使用NULL字段(NULL字段很難查詢優化、NULL字段的索引需要額外空間、NULL字段的復合索引無效)。少用text類型(盡量使用varchar代替text字段)
(5)、在涉及到金額的時候如果對精度要求不高的情況下可以優先使用float,其次是使用double來進存儲。如果對精度要求比較高的情況下最好使用decimal來存儲,但是相應的它 的效率沒有float和double那么高效。具體使用哪種還是要根據業務的具體需求來選擇。
(6)、關於date和datetime的用法,就要看你想要存儲時間的精確值了,如果僅僅是想要精確到天的話使用date就可以了(如mysql中出生日期使用date類型),如要要精確到秒一級別的就要使用datetime了。有時候大家使用datetime的使用卻只是存儲到天的日期單位時,這個時候就會自動添加00:00:00在數據的后面,作為秒一級別的數據。
(7)、int(5)和int(10)的區別是什么?想必大家也很好奇吧,其實5和10其實只是顯示長度的卻別而已,也就是不管int(x)x的值是什么值,存儲數字的取值范圍還是int本身數據類型的取值范圍,x只是數據顯示的長度而已。
4)、數據庫中每個字段的規范描述
(1)盡量遵守第三范式的標准(3NF)。表內的每一個值只能被表達一次;表內的每一行都應當被唯一的標示;表內不應該存儲依賴於其他鍵的非鍵信息
(2)如果字段事實上是與其它表的關鍵字相關聯而未設計為外鍵引用,需建索引
(3)如果字段與其它表的字段相關聯,需建索引
(4)如果字段需做模糊查詢之外的條件查詢,需建索引
(5)除了主關鍵字允許建立簇索引外,其它字段所建索引必須為非簇索引
5)、數據庫命名規范。采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下划線'_'組成,命名簡潔明確,多個單詞用下划線'_'分隔,如:tb_freight_template
一個項目一個數據庫,多個項目慎用同一個數據庫