我用nodejs制作了一些api系统。
我还使用sequelize(版本4)与MySQL进行通信。
下面是我的模型结构。
[用户]
[文章]
userid
的FK)我用sequelize orm进行了这样的定义。
import Sequelize from 'sequelize';
const sequelize = new Sequelize('db', 'user', 'pw', {
host: '127.0.0.1',
dialect: 'mysql'
})
const User = sequelize.define('user', {
no: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
userid: {
type: Sequelize.STRING(30),
allowNull: false,
unique: true
},
userpw: {
type: Sequelize.STRING(30),
allowNull: false
}
}, {
freezeTableName: true,
timestamps: true,
underscored: true
});
const Article = sequelize.define('article', {
no: {
type: Sequelize.INTEGER,
primaryKey: true
},
subject: {
type: Sequelize.STRING(50),
allowNull: false
},
content: {
type: Sequelize.STRING(100),
allowNull: false
},
writer: {
type: Sequelize.STRING(30),
references: {
model: 'user',
key: 'userid'
}
}
}, {
freezeTableName: true,
timestamps: true,
underscored: true
})
sequelize.sync({
force: true
});
export default { User, Article };
在Article
模型中,我定义写入并引用User
的用户ID。
所以Article
的writer列是外键,引用了User
的用户ID。
因为如果删除了用户,则必须删除相关文章。
运行该代码,将创建表,结构如下。
mysql> desc user;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| no | int(11) | NO | PRI | NULL | auto_increment |
| userid | varchar(30) | NO | UNI | NULL | |
| userpw | varchar(30) | NO | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> desc article;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| no | int(11) | NO | PRI | NULL | |
| subject | varchar(50) | NO | | NULL | |
| content | varchar(100) | NO | | NULL | |
| writer | varchar(30) | YES | MUL | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
之后,我搜索了有关续集orm中关联的更多信息。
我发现sequelize具有许多关联,例如hasMany
,BelongsTo
,'hasMany`,...
因此,我将User.hasMany(Article);
添加到之前的代码中并运行它,它添加了更多列。
mysql> desc article;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| no | int(11) | NO | PRI | NULL | |
| subject | varchar(50) | NO | | NULL | |
| content | varchar(100) | NO | | NULL | |
| writer | varchar(30) | YES | MUL | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| user_no | int(11) | YES | MUL | NULL | |
+------------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
user_no
列已添加。
我认为它是通过hasMany
函数自动添加的。
但是对于我来说,我不必创建user_no
,因为我已经引用了User
的{{1}}列。
总的来说,我的问题是:
我认为我不必设置user_id
。是吗?
为什么ORM提供关联功能?只是为了方便?还是有任何原因?
谢谢。