【问题标题】:Building a SaaS product with Node + Express + Sequelize + (Mysql or Postgres)使用 Node + Express + Sequelize + (Mysql or Postgres) 构建 SaaS 产品
【发布时间】:2018-11-14 08:40:36
【问题描述】:

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

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

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

所以一开始我们使用的是Mysql,但是我们没有找到如何在mysql中获取多个schema,我们使用的是Sequelize作为ORM。

经过大量谷歌搜索,我们发现许多基于 多租户 的产品都在使用 postgresql 作为强大的模式方法,因此我们尝试了这个库:

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

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

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

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

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

【问题讨论】:

  • 如果您最终改变了对查询的想法,您应该查看 GraphQL,这是一种用于您的 API 的简单查询语言。 graphql.org
  • 恕我直言,您应该选择选项 3。我们遇到了同样的情况。我在博客上写了为什么以及如何here

标签: mysql node.js postgresql sequelize.js saas


【解决方案1】:

最后我决定使用选项 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 连接

为了测试,我正在创建一个名为“inventory”的表

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

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

所以最后我为每个客户端都有了干净的单独架构

谢谢!

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多