物件型介面

天笑發表於2017-03-03

物件型介面

為了更好的理解之後章節的示例,我們先了解一下示例中用到的資料模型。

[資料模型描述方式]

下面是幾個資料表,每個表都應有個作為主鍵的id欄位,是可自動增長的整數型別,即使是關聯表也應定義id欄位作為主鍵。

使用者:
@User: id, uname, phone(s), pwd, name(s), createTm

訂單:(用Ordr而不是Order詞是避免與SQL關鍵字衝突。)
@Ordr: id, userId, status(2), amount, dscr(l)
- status: Enum. 訂單狀態。CR-新建立,RE-已服務,CA-已取消.

訂單日誌:
@OrderLog: id, orderId, tm, action(2), dscr
- action: Enum. 操作型別。CR-建立訂單,PA-付款,RE-完成服務,CA-取消訂單.

介面呼叫日誌:
@ApiLog: id, tm, addr, app, ac, retval&, req(t), res(t)

一個使用者對應多個訂單(通過userId關聯),一個訂單包含多個物件,以及有多個訂單日誌(通過orderId關聯),表示如下:

User 1<->n Ordr (userId)
Ordr 1<->n OrderLog (orderId)

在設計文件DESIGN.wiki中,我們用@表名: 欄位名1, 欄位名2這樣的格式來定義資料模型。前面講過,通過tool/upgrade.php工具可以把它們建立或更新到資料庫中。

欄位名的型別根據命名規範自動判斷,比如以id結尾的欄位會被自動作為整型建立,以tm結尾會被當作日期時間型別建立,其它預設是字串,規則如下:

| 規則                                 | 型別                   |
| -----------------------------------  | --------------------   |
| 以"Id"結尾                           | Integer                |
| 以"Price"/"Total"/"Qty"/"Amount"結尾 | Currency               |
| 以"Tm"/"Dt"/"Time"結尾               | Datetime/Date/Time     |
| 以"Flag"結尾                         | TinyInt(1B) NOT NULL   |

例如,"total", "docTotal", "total2", "docTotal2"都被認為是Currency型別(欄位名後面有數字的,判斷型別時數字會被忽略)。

也可以用一個型別字尾表示,如 retval&表示整型,規則如下:

| 字尾 | 型別      |
| --   | -------   |
| &    | Integer   |
| @    | Currency  |
| #    | Double    |

字串可以指定長度如status(2)name(s),字串長度以如下方式描述:

| 標記 | 長度                |
|----- | ------------------- |
| s    | small=20            |
| m    | medium=50 (default) |
| l    | long=255            |
| t    | text                |

為了簡化介面物件到資料庫表的對映,我們在資料庫中建立的表名和欄位名就按上述大小寫相間的風格來,表名或物件名的首字母大寫,表欄位或物件屬性的首字母小寫。

某些版本的MySQL/MariaDB在Windows等系統上表和欄位名稱全部用大寫字母,遇到這種情況,可在配置檔案my.ini中加上設定:

[mysqld]
lower_case_table_names=0 

然後重啟MySQL即可。

相關文章