Создание SaaS-продукта с помощью Node + Express + Sequelize + (Mysql или Postgres) - PullRequest
0 голосов
/ 05 июня 2018

Мы планируем создать продукт на основе 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?

1 Ответ

0 голосов
/ 06 июня 2018

Наконец, я решил использовать вариант 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 (Таблица Business приходит из отдельной базы данных (которая является супер основной базой данных приложения), поэтому я нахожу бизнес-код, циклы и создаю динамические схемы в postgres

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

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

Спасибо!

...