DEV Community

Yeeun Ju
Yeeun Ju

Posted on

Understanding Multi-tenancy

What is Multi-tenancy?

An easy example to understand multi-tenancy is to think about an email service.

Multi-tenancy is:

  • A software architecture pattern.
  • A way for a single software instance to support multiple users (tenants).
  • Each tenant uses the software in a separate environment, maintaining independence in terms of data, settings, user management, and more.

multi-tenancy

The main characteristics of multi-tenancy are:

  1. Resource Sharing: Multiple tenants share a single software instance and infrastructure, reducing costs and using resources efficiently.
  2. Independence: Each tenant has its own database or uses a separate schema in a shared database, preventing access to other tenants' data and settings.
  3. Scalability: The system can be scaled to accommodate multiple tenants, commonly used in cloud environments.
  4. Customization: Each tenant can customize the software to meet their specific needs without affecting the shared instance.

Resource Sharing with Independence?

Consider the following example for better understanding:

Examples of multi-tenancy include SaaS (Software as a Service) models, with notable services such as Microsoft Office 365 and Google Workspace. These services allow multiple companies or users to use the software independently on a single infrastructure.

  1. Shared Resources:
    • Server Infrastructure: MailCloud allows multiple tenants (various companies) to share a single server infrastructure. (Server infrastructure: mail server, DB server, app server, etc.)
    • Application Code: All tenants use the same mail application code, ensuring consistent behavior regardless of the user.
  2. Independence:
    • Data Separation: If Company A and Company B both use MailCloud, emails sent and received by Company A's employees are either stored in separate database tables from Company B's emails or distinguished by tenant IDs within the same table.
    • User Management and Settings: Each company can manage users, settings, and customization independently.

How is Separation Implemented??

  1. Separate Table Method:
    • Using separate databases or tables for each tenant.
    • Pros: High level of data independence and security due to physical separation of data.
    • Cons: Management can become complex as the number of tenants increases.
  2. Shared Table Method:
    • Using a single database table for multiple tenants, with an additional column like Tenant ID to identify data.
    • Pros: Simplifies the database structure and improves scalability.
    • Cons: Requires additional security and query filtering logic to separate tenant data.

Implementing Multi-tenancy in MongoDB:

Using Separate Databases:

 ```bash
 use tenantA_db;
 db.users.insert({ tenantId: "A", name: "John Doe", email: "john@example.com" });

 use tenantB_db;
 db.users.insert({ tenantId: "B", name: "Jane Smith", email: "jane@example.com" });
 ```
Enter fullscreen mode Exit fullscreen mode
  • Insert data into different databases.
  • Pros: Strong data separation and easy security management.
  • Cons: Complex management as the number of databases increases.

Using Separate Collections in One Database:

 ```bash
 use shared_db;
 db.tenantA_users.insert({ name: "John Doe", email: "john@example.com" });
 db.tenantB_users.insert({ name: "Jane Smith", email: "jane@example.com" });
 ```
Enter fullscreen mode Exit fullscreen mode
  • Pros: Reduces the number of databases, simplifying management.
  • Cons: Increases the number of collections.

Document-Level Separation in One Collection:

 ```bash
 use shared_db;
 db.users.insert({ tenantId: "A", name: "John Doe", email: "john@example.com" });
 db.users.insert({ tenantId: "B", name: "Jane Smith", email: "jane@example.com" });

 // Query data for a specific tenant
 db.users.find({ tenantId: "A" });
 ```
Enter fullscreen mode Exit fullscreen mode
  • Pros: Easy management.
  • Cons: Requires query optimization and attention to security and data access control.

Choosing the Right Approach:

  1. Separate Databases:
    For applications with high security requirements, such as financial services. Offers high security and independence, with easier database-level backup and recovery.

  2. Separate Collections:
    Suitable for small to medium applications with relatively low data volumes. Reduces the number of databases and is easier to manage.

  3. Document-Level Separation:
    Ideal for SaaS applications supporting many tenants. Offers high scalability, cost-efficiency, and easy expansion in cloud environments, making it the most commonly used approach.

Top comments (0)