迹忆客 专注技术分享

当前位置:主页 > 学无止境 >

PostgreSQL & Sequelize:我们应该使用关系数据库吗?

作者:迹忆客 最近更新:2022/06/12 浏览次数:

我们应该使用关系数据库吗?

让我们假设答案是肯定的。 在这个前提下,我们可以继续阅读。

Sequelize 是一个所谓的 ORM(“对象关系管理器”)。现在,我们的应用程序与数据库通信不一定需要这些库。 在以下内容中,大家可以阅读我对 ORM 在哪些方面有很大帮助以及在哪些方面可能没有帮助的一些想法。

假设各位已经了解 PostgreSQLNode.js 的基础知识。

首先,Sequelize 的基础是什么:

  • 它适用于许多不同的数据库:Postgres、MySQL、MariaDB、SQLite 等
  • 我们只需要定义自己的模型和类型(很像在数据库层本身)
  • 可以获得很多开箱即用的功能
  • 从应用程序到数据库的所有事务都通过 Sequelize 发生。 这个额外的层可以更容易地设置保护措施,因此脏数据不会被写入数据库。

定义模型

现在,这是使用 ORM 最酷的事情之一——在代码中包含我们自己的数据库方案和模型。 它有点像基础设施即代码,但用于您的数据库。 让我们看一个例子:

const { DataTypes } = require("sequelize");


const MyDBModel = {
  id: { type: DataTypes.STRING, primaryKey: true },
  name: { type: DataTypes.STRING },
  date: { type: DataTypes.DATE },
  someNumber: { type: DataTypes.INTEGER, allowNull: true },
  incrementMe: { type: DataTypes.INTEGER, autoIncrement: true }

}

有了这样的 MyDBModel,我可以使用 Sequelize 中的内置数据类型,它会自动为我们提供类型检查。 上面是一个简单的例子,有一个主键和几个不同的数据类型字段。

现在我们可以使用上面的定义来插入新项目以及执行功能。

假设我们想从所有具有特定名称的行中获取 id、name、date 和 incrementMe:

1. 使用 ORM 方式

const getRowForSite = async ({ connection, name }) => { // This method takes a specific connection to the db (This is also provided from Sequelize) 
  try {
    const Model = connection.define("Model", MyDBModel);
    let res = await Model.findAll({
      attributes: ["id", "date", "name", "incrementMe"],
      order: connection.literal('date DESC'),
      where: {
        name
      }
    });
    return res;
  } catch (error) {
    return Promise.reject(error);
  }
};

2. 使用 SQL 方式

以上将返回与等效的原始 SQL 查询相同的结果:

SELECT id, date, name, incrementMe
FROM MODEL
WHERE name = 'YOUR NAME'
ORDER BY date DESC

现在这似乎不是一个大胜利。 但是在第一个示例中,构建额外的逻辑并在代码的许多地方重用该函数要容易得多。 这只是一个简单的例子,但我观点很清楚。

对于插入,我们还增加了类型检查的功能。 其他有用的功能是:

  • findOrCreate 见名知意。 创建一条数据或检索现有数据(如果存在)。
  • findAndCountAll 这对于创建与分页相关的查询很有用。
  • Validators 这些是我们可以分配给自己的字段的额外“检查”。 这些不同于 type 字段,因为它本质上是由 Sequelize 创建的预配置正则表达式。 这可能是我们只允许在特定字段中使用 x 字符,或者将只允许在另一个字段中使用 isIPv6。 可以在此处找到更长的验证器列表

总结

许多人不擅长编写 SQL,包括我自己。这很可能是由于我在职业生涯中担任的角色,没有太多关注数据库层。

在非常大的系统中,将重点放在数据库上并尽可能优化它的所有部分会很有帮助。

以我的经验,这在大型项目中是有意义的,但在较小的项目中,数据库的东西通常只是你在开始/创建数据库期间接触的东西。

由于这些原因,我从来没有在编写查询和专门研究超高级数据库模式方面得到一致的实践。因此,我也发现使用 ORM 是一件令人愉快的事情,因为这一切似乎都更加规范化,我更加自在。

作为一种更简单的折衷方案,ORM 有时会为我们创建性能不如超级熟练的开发人员可以编写的查询。对于我的用例,目前性能还不错。

最后一点:ORM 通常是相对较大的库,因此在某些情况下,所有的代码不会比添加额外的代码来生成构建时间、更新时间等,这给我们带来很多的好处。

除非注明转载,本站文章均为原创或翻译,欢迎转载,转载请以链接形式注明出处

本文地址:

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

教程更新

热门标签

扫码一下
查看教程更方便