Создание SaaS-продукта с помощью Node + Express + Sequelize + (Mysql или Postgres)

0

Мы планируем построить продукт на основе SaaS, поэтому, главным образом после большого поиска, мы обнаружили, что для разработки продукта SaaS существует три подхода к базе данных.

  1. Отдельная база данных для каждого арендатора
  2. Отдельные схемы для каждого арендатора
  3. Общая схема и одна база данных для всех арендаторов (но будет запрашивать с помощью tenant_id)

Поэтому мы планируем перейти к варианту 2,

Поэтому изначально мы используем Mysql, но мы не нашли, как получить несколько схем в mysql, мы используем Sequelize как ORM.

После большого количества поисковых запросов мы обнаружили, что много продуктов на основе многопользовательских сайтов используют postgresql для мощного подхода к схеме, поэтому мы попробовали эту библиотеку:

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

Мы попробовали эту библиотеку для множественного подхода на основе схемы, но данные не отображаются в соответствии с арендатором. Также я открыл проблему в github,

Поэтому, если у вас есть какие-либо идеи или какая-либо должность, которая поможет мне построить продукт SaaS, помогите мне

ПРИМЕЧАНИЕ. Мой стек: Узел + Экспресс + Угловой + Mysql или Postgres

Мой вопрос: как использовать несколько схем в postgres?

  • 0
    Если вы в конце концов передумаете о запросах, вам следует обратиться к GraphQL, простому языку запросов для вашего API. graphql.org
  • 1
    ИМХО, вам следует перейти с варианта 3. У нас была такая же ситуация. Я писал о том, почему и как это здесь
Теги:
sequelize.js
saas

1 ответ

0

Наконец, я решил использовать вариант 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

Просто для теста я создаю таблицу под названием "инвентарь",

В моем приложении он пришел в систему, и он подписался, в то время как я регистрирую там Business Code в моей таблице Business (таблица Business, поступающая из отдельной базы данных, которая представляет собой супер-основное приложение DB), поэтому я нахожу бизнес-код и цикл и создавать динамические схемы в postgres

Теперь см. Мой api, я делаю CRUD на основе req.user.code (из сеанса входа в систему), и я, наконец, сопоставляю данные с данными в соответствии с конкретными схемами,

Итак, наконец, у меня есть чистые отдельные схемы для каждого клиента

Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню