我用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有很多关联,如 hasManyBelongsTo ,'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 ,因为我已经引用了 Useruser_id 列 .

总的来说,我的问题是:

  • 我想我不必在我的情况下设置 hasMany . 这样对吗?

  • 为什么ORM提供关联功能?为方便起见?或者有什么理由吗?

谢谢 .