为什么在关联orm中使用关联?

时间:2018-07-15 10:24:47

标签: node.js orm sequelize.js

我用nodejs制作了一些api系统。

我还使用sequelize(版本4)与MySQL进行通信。

下面是我的模型结构。

[用户]

  • 没有(PK)
  • 用户名
  • userpw

[文章]

  • 没有(PK)
  • 主题
  • 内容
  • writer(用户的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具有许多关联,例如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,因为我已经引用了User的{​​{1}}列。

总的来说,我的问题是:

  1. 我认为我不必设置user_id。是吗?

  2. 为什么ORM提供关联功能?只是为了方便?还是有任何原因?

谢谢。

0 个答案:

没有答案