Веб-приложение Rails: вы создаете отдельную базу данных для каждой открытой учетной записи? - PullRequest
4 голосов
/ 03 сентября 2011

Я собираюсь закончить создание простого веб-приложения поддержки на основе подписки. Я настраиваю авторизацию. Но так как это будет мое собственное веб-приложение, которое я собираюсь развернуть, мне интересно об этом.

Вы создаете отдельную базу данных для каждой открытой учетной записи?

Допустим, у вас есть это веб-приложение для поддержки. У вас есть ОДИН и ТОЛЬКО ОДИН владелец аккаунта. Владелец аккаунта может настроить агентов, которые могут отвечать на запросы поддержки. Кроме того, есть роли клиентов, которые открывают заявки на поддержку.

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

Какой лучший путь?

1) Создать одну базу данных для всего приложения? Таким образом, каждый раз, когда кто-то регистрируется, все добавляется в одну базу данных с данными о других билетах и ​​пользователях и всем остальным или ...

2) Каждый раз, когда кто-то регистрируется, создайте отдельную базу данных для каждой подписки на аккаунт.

Я думаю, что, возможно, вариант № 2 будет лучшим выбором для обеспечения безопасности и целостности данных. Если да, то как ты решил эту проблему?

Ответы [ 2 ]

6 голосов
/ 03 сентября 2011

Похоже, что вы хотите, это Multitenancy:

Multitenancy относится к принципу в архитектуре программного обеспечения, где один экземпляр программного обеспечения работает на сервере, обслуживая несколько организаций клиентов (арендаторов).Работа с несколькими арендаторами противопоставляется архитектуре с несколькими экземплярами, в которой отдельные экземпляры программного обеспечения (или аппаратные системы) устанавливаются для разных организаций-клиентов.Благодаря многопользовательской архитектуре программное приложение предназначено для виртуального разделения своих данных и конфигурации, и каждая клиентская организация работает с настроенным экземпляром виртуального приложения.- Статья в Википедии о мультитенантности

Эта статья, хотя она и немного устарела, является общей идеей того, как мне поступить. Simple Rails Multi-Tenancy .Он чистый и эффективный и избавляет вас от написания кода, который вам не нужен.

4 голосов
/ 03 сентября 2011

Вам следует перейти на вариант № 1. Номер 2 (почти (возможно, есть случаи, когда это хорошо, но я пока не могу его найти)) никогда не выход.

Вы правы в целях безопасности (ну, в некотором смысле), но это также создает множество других проблем, о которых вам придется подумать.

  1. Наличие отдельной базы данных для каждого пользователя означает, что для каждого запроса (помните, что HTTP не имеет состояния) вам нужно будет открыть новое соединение с базой данных, сделать все необходимое, а затем закрыть соединение снова, вместо использования пула соединений, который есть в Rails. Это сильно влияет на производительность.

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

  3. Вам придется обойти всю обработку соединений в Rails, поскольку там обычно одна база данных на приложение. Легко изменить базу данных для конкретных моделей, но она добавляет дополнительные места, где что-то может пойти не так.

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

...