我用nodejs制作了一些api系统 .
我还使用sequelize(版本4)与MySQL进行通信 .
下面是我的模型结构 .
[用户]
-
不(PK)
-
userid
-
userpw
[文章]
-
不(PK)
-
主题
-
内容
-
作者(FK到用户的
userid
)
我用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
模型中,我定义了write并引用 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)
在这之后,我在sequelize 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
的 user_id
列 .
总的来说,我的问题是:
-
我想我不必在我的情况下设置
hasMany
. 这样对吗? -
为什么ORM提供关联功能?为方便起见?或者有什么理由吗?
谢谢 .