來架個網站吧-10.資料規劃
tags: 來架個網站吧
完成需求訪談與系統流程規劃後,接下來就是資料規劃。
恩~距離打程式碼真的還有一段路 XDDD
在規劃資料表前需要考慮一些因素
- 系統資料來源
- 系統功能
- 使用的技術框架
- 未來資料成長量
上述因素是我在規劃資料表時必須考慮的因素。
系統資料來源
這次的需求資料來源是國語小字典,下圖是資料的部份擷圖。
乍看之下,有一點亂
觀察資料之後,可以設計下列資料表欄位:
- [項目]: [規劃欄位英文名稱] / [欄位資料型態]/ [長度]
- 單字: word / 文字 / 1
- 部首: radical / 文字 / 1
- 總筆畫數: total_strokes / 數值 / N/A
- 部首外筆畫: out_strokes / 數值 / N/A
- 注音: mpc / 文字 / 4
- 解釋: explanation / 很多文字 / N/A
系統功能
看完資料之後,接下來要將系統功能加入考慮因素。此次的功能有搜尋
單字、系統要承受每分鐘10次查詢
,所以欄位單字
會開定長。
- [項目]: [規劃欄位英文名稱] / [欄位資料型態]/ [長度]
- 單字: word /
定長文字
/ 1 - 部首: radical / 文字 / 1
- 總筆畫數: total_strokes / 數值 / N/A
- 部首外筆畫: out_strokes / 數值 / N/A
- 注音: mpc / 文字 / 4
- 解釋: explanation / 很多文字 / N/A
使用的技術框架
技術框架也會影響資料規劃,本次是使用下列技術:
- 資料庫: Postgresql-15
- 框架(Framework): Grails
以資料庫來說,可變動文字
型態,在Oracle 會是以 varchar2
,如果資料欄位中預期會有中文字則會採用nvarchar2
,在postgresql需要規劃varchar
即可。
本次是使用postgresql,所以下列是加入資料庫因素的資料表欄位:
- [項目]: [規劃欄位英文名稱] / [欄位資料型態]
- 單字: word / char(1)
- 部首: radical / varchar(1)
- 總筆畫數: total_strokes / integer
- 部首外筆畫: out_strokes / integer
- 注音: mpc / varchar(4)
- 解釋: explanation / text
另外在程式技術框架,因為Grails
是採用事先約定規則,因此在規劃資料需要多開下列欄位
以下是這次資料表的完整規劃
- [項目]: [規劃欄位英文名稱] / [欄位資料型態] / [其他]
- id: id / bigint
- version: version / integer
- dateCreated: date_created / timestamp
- lastUpdated: last_updated / timestamp
- 單字: word / char(1)
- 部首: radical / varchar(1)
- 總筆畫數: total_strokes / integer
- 部首外筆畫: out_strokes / integer
- 注音: mpc / varchar(4)
- 解釋: explanation / text
table schema
以下是最後完成的table schema
create table dict(
id bigint generated always as identity,
version integer default 0,
date_created timestamp default CURRENT_TIMESTAMP,
last_updated timestamp,
word char(1),
radical varchar(1),
total_strokes integer,
out_strokes integer,
mpc varchar(4),
explanation text,
CONSTRAINT dict_pk PRIMARY KEY (id)
);
comment on table dict IS '字典';
comment on column dict.word is '單字';
comment on column dict.radical is '部首';
comment on column dict.total_strokes is '總筆畫數';
comment on column dict.out_strokes is '部首外筆畫';
comment on column dict.mpc is '注音';
comment on column dict.explanation is '解釋';
create unique index dict_un1 on dict (word);