# 定義模型
> 譯者:[飛龍](https://github.com/wizardforcel)
> 來源:[Defining Models](https://github.com/dresende/node-orm2/wiki/Defining-Models)
在[連接](1. Connecting to Database.md)之后,你可以使用連接對象(`db`)來定義你的模型。你需要指定模型的名稱,一個用于描述的屬性和一些(可選的)選項。下面是一個簡短的例子:
```
var Person = db.define('person', {
id: {type: 'serial', key: true}, // the auto-incrementing primary key
name: {type: 'text'},
surname: {type: 'text'},
age: {type: 'number'}
}, {
methods : {
fullName: function() {
return this.name + ' ' + this.surname;
}
}
});
```
這個模型叫做`person`(通常也是數據庫里面表的名稱),它有三個屬性(`name`和`surname`為文本,`age`為數值)。如果你自己不指定任何鍵的話,默認的`id: { type: 'serial', key: true }`會添加進來。在這個例子中,有個模型方法叫做`fullName`。下面是這個模型的使用方法的示例:
```
Person.get(73, function(err, person) {
if (err) throw err;
console.log('Hi, my name is ' + person.fullName());
});
```
這會獲取`id=73`的`person`對象,并且打印出它的名字和姓氏。其它類型的可用屬性請見[這里](3.1 Model Properties.md)。
## API
```
/**
* @param {Object} props Property definitions
* @param {Object} opts Options
*/
db.define(props, opts)
```
`db.define()`接收的第一個對象(第二個參數)被稱為屬性對象,它定義了所有的[屬性](3.1 Model Properties.md)。
第二個對象指定了額外的選項:
| 選項名稱 | 類型 | 描述 |
| --- | --- | --- |
| `collection` | `String` | 覆寫數據庫中表的名稱 |
| `methods` | `Object` | 模型實例上的額外方法,它會被設置到實例上。 |
| `hooks` | `Object` | 用戶定義的[鉤子或回調](3.3 Model Hooks.md) |
| `validations` | `Object` | 用戶定義的[驗證器](3.2 Model Validations.md) |
| `id` | `Array` | 為了支持在`properties`上設置`key: true`而不提倡使用 |
| `cache` | `Boolean` | 允許你開啟或者禁用單例行為。它叫做`cache`,但是和緩存毫無關系。 |
| `autoSave` | `Boolean` | 不推薦。在屬性修改時自動保存模型。 |
| `autoFetch` | `Boolean` | 是否自動獲取關聯 |
| `autoFetchLimit` | `Number` | 自動獲取關聯的深度 |
| `cascadeRemove` | `Boolean` | 刪除實例時是否要刪除關聯 |