首页 > 解决方案 > 使用 Node + Express + Sequelize + (Mysql or Postgres) 构建 SaaS 产品

问题描述

我们正计划构建一个基于 SaaS 的产品,所以主要经过大量搜索,我们发现设计 SaaS 产品有三种数据库方法。

  1. 每个租户的单独数据库
  2. 每个租户的单独架构
  3. 所有租户的共享架构和一个数据库(但将使用tenant_id查询)

所以我们计划进入选项2,

所以最初我们使用Mysql,但是我们没有找到如何在mysql中获取多个模式,我们使用的是Sequelize作为ORM。

经过大量谷歌搜索,我们发现许多基于多租户的产品正在使用 postgresql 来实现强大的模式方法,所以我们尝试了这个库:

https://github.com/westmark/sequelize-multi-tenant-enhancer

我们尝试了这个库用于基于多个模式的方法,但是数据没有根据租户显示,我也在 github 中打开了一个问题,

因此,如果您有任何想法或任何帖子可以帮助我构建 SaaS 产品,请帮助我

注意:我的堆栈:Node + Express + Angular + Mysql 或 Postgres

我的问题是如何在 postgres 中使用多个模式?

标签: mysqlnode.jspostgresqlsequelize.jssaas

解决方案


最后我决定使用选项 2,我转向 Postgresql 而不是 mysql,因为 Postgresql 有基于模式的方法!

现在我的最终代码:

const postgresDB = new Sequelize('postgres://localhost:5432/test_enduser');

postgresDB.authenticate().then((err) => {
  if (err) {
    console.log('There is connection in ERROR.');
  } else {
    console.log('Postgres Connection has been established successfully');
  }
});

postgresDB.define('inventory', {
  name: Sequelize.STRING,
});

const createSchema = () => {
  Business.findAll({
    raw: true,
  }).then((data) => {
    data.forEach((client) => {
      postgresDB.createSchema(client.code).then(() => {
        Object.keys(postgresDB.models).forEach((currentItem) => {
          postgresDB.models[currentItem].schema(client.code).sync();
        });
        // new schema is created
        console.log('Postgres schema created');
      }).catch((err) => {
        console.log(err.message);
      });
    });
  });
};
createSchema();


// apis
exports.getAllBusiness = (req, res) => {
  postgresDB.models.inventory.schema(req.user.code).findAll()
    .then((results) => {
      res.send(results);
    });
};

exports.postBusiness = (req, res) => {
  const user = {
    name: req.body.name,
  };
  postgresDB.models.inventory.schema(req.user.code).create(user)
    .then(data => res.status(200).send(data))
    .catch(Sequelize.ValidationError, err => res.status(422).send(err.errors[0].message))
    .catch(err => res.status(400).send(err.message));
};

我正在设置我的 postgres 连接

只是为了测试我正在创建一个名为“库存”的表

在我的应用程序中,在线来了他注册,而注册时我将业务代码存储到我的业务表中(业务表来自单独的数据库,这是一个超级主应用程序数据库),所以我正在查找业务代码并循环和在 postgres 中制作动态模式

现在看看我的 api,我正在根据 req.user.code(来自登录会话)进行 CRUD,我最终根据特定模式匹配显示数据,

所以最后我为每个客户都有干净的单独模式

谢谢!


推荐阅读