Как наилучшим образом организовать структуру backend-части проекта?

Как организовать базы данных для проекта, который включает суши-бары в разных городах? Как на бэкенде, используя sequelize или другие методы, определить город, из которого поступает запрос, и как обеспечить отдельные операции с соответствующими базами данных для каждого города? Каким образом можно реализовать это с использованием cookies или других способов для разграничения контекстов и выполнения операций с разными базами данных? Как изменить текущий код бэкенда, чтобы работать с отдельными базами данных для каждого города?
  • 1 января 2024 г. 18:27
Ответы на вопрос 3
Организация структуры backend-части проекта может зависеть от конкретных требований и масштаба проекта, но в целом рекомендуется следовать принципам чистой архитектуры (Clean Architecture) или похожему подходу.

Один из возможных способов организации структуры backend-части может включать следующие компоненты:

1. Контроллеры (Controllers): Отвечают за обработку запросов от клиента и вызов соответствующих сервисов.

2. Сервисы (Services): Содержат бизнес-логику и логику доступа к данным. Здесь можно организовать функции работы с базами данных, взаимодействие с моделями и другие операции.

3. Репозитории (Repositories): Отвечают за операции чтения и записи данных в базы данных.

4. Модели (Models): Описывают структуру данных и манипуляции с ними. Могут соответствовать объектам в базах данных.

5. Middleware: Могут использоваться для выполнения определенных операций перед или после обработки запросов, например, для проверки аутентификации или авторизации.

Что касается организации баз данных для проекта, который включает суши-бары в разных городах, одним из подходов может быть создание отдельной базы данных для каждого города. Это позволит разграничить данные и операции для каждого города.

Для определения города, из которого поступает запрос, можно использовать различные способы, включая:

1. IP-адрес: Используйте API геолокации, чтобы определить происхождение IP-адреса клиента.

2. Куки (Cookies): Используйте куки, которые могут содержать информацию о городе. Например, при первом визите клиента, можно установить куки с информацией о городе, а затем при каждом запросе использовать эту информацию.

3. Запрос клиента: Клиент может включать информацию о городе в заголовках запроса.

Чтобы обеспечить операции с соответствующими базами данных для каждого города, можно использовать переменные окружения или конфигурационные файлы для хранения информации о подключении к базам данных (например, хост, порт, имя базы данных). При обработке каждого запроса вы можете использовать определенную логику для выбора соответствующей базы данных на основе информации о городе из запроса.

Пример реализации с использованием sequelize:

1. Определите модель для суши-бара, которая будет соответствовать таблице в базе данных.

```javascript
const { Model, DataTypes } = require('sequelize');

class SushiBar extends Model {
  static init(sequelize) {
    super.init(
      {
        name: DataTypes.STRING,
      },
      { sequelize }
    );
  }
}

module.exports = SushiBar;
```

2. Определите модель для города, которая будет соответствовать таблице в базе данных.

```javascript
const { Model, DataTypes } = require('sequelize');

class City extends Model {
  static init(sequelize) {
    super.init(
      {
        name: DataTypes.STRING,
      },
      { sequelize }
    );
  }
}

module.exports = City;
```

3. Создайте миграции для создания таблиц в базе данных для моделей SushiBar и City.

4. В контроллере или сервисе, где обрабатываются запросы
Если монолитная архитектура, то третья нормальная форма по дефолту везде стандарт при проектировании, города в отдельную таблицу закинь, филиалы отдельно и через многие ко многим свяжи их с доп инфой какая понадобится, например ип адреса филиала можно хранить и по ним авторизовывать, все остальные данные какие идут от филиала связывай с этой строчкой. 

Если микросервисы, то принцип примерно тот же, но на 1 сервис одна база, на одном сервере храним таблицу городов с инфой о имеющихся там филиалах, в джейсонах или масивах, на каждом филиале храним свой инстац базы со всей инфой которая там происходит и по необходимости через API запрашиваем выборку по филиалу с других сервисов.
Вопрос: Как правильно сделать организацию баз(ы) данных

В одной базе данных где у каждого клиента будет foreign key (branchId) который указывает на филиал (город)
Как на бэкенде используя sequelize (или без него) проверять из какого города запрос? Как по мне самый правильный вариант с помощью cookies

Сессия (cookies)
Похожие вопросы