首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多租户应用场景中,同一个模型可以有不同的属性吗?

在多租户应用场景中,同一个模型可以有不同的属性吗?
EN

Stack Overflow用户
提问于 2019-03-24 16:57:46
回答 1查看 217关注 0票数 0

我必须设计一个多租户应用程序,我需要在同一模型中的每个租户自定义字段。

客户1需要使用一些自定义字段,客户2需要管理同一表中的其他字段,以此类推。

这是一个示例:同一个表(票证)有一个公共(基本)字段列表,那么每个租户在模型中都应该有自己的附加列:

我想实现一个EF代码优先的.Net核心web应用程序。

代码语言:javascript
复制
namespace Models.Base
{
    public class TicketBase
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public Datetime CreationDate { get; set; } 
    }
}

租户1

代码语言:javascript
复制
namespace Models.Tenant1
{
    public class Ticket : TicketBase
    {

        public string CustomerName { get; set; }
        public Datetime DateCustomerCall { get; set; } 
    }
}

租户2

代码语言:javascript
复制
namespace Models.Tenant2
{
    public class Ticket : TicketBase
    {

        public string AnotherDescription { get; set; }
        public Datetime AnotherDate { get; set; } 
    }
}

以这种方式设计模型是正确的,还是有不同的方法来解决这个非常常见的问题?

EN

回答 1

Stack Overflow用户

发布于 2019-03-24 19:04:27

在SaaS中,拥有单一的代码库和灵活的多租户配置/扩展是成功的关键。

要为每个租户启用自定义字段,业务模型必须具有固定的基本字段集。自定义字段必须按entityid和tenantid存储在单独的表中。

您的表格可能类似于下面给出的表格。这种模型是首选的,因此具有通用扩展表将导致较低的可伸缩性,并且随着使用量的增加,可能很快就会被数据量填满。

票证

TicketExtn (包含租户和实体的自定义字段的扩展表)

TicketExtn表将包含如下字段

TicketId TenantId FieldId FieldValue FieldDataType等当我们尝试为Ticket实体获取数据时,我们还将从TicketExtn表中获取数据,并在模型中设置字段。

BaseModel将如下图所示

代码语言:javascript
复制
public class ExtendedField
{
    public Guid Id { get; set; }
    public string FieldName { get; set; }
    public Guid DataTypeId { get; set; }
    /// <summary>
    /// Can also be a typed class, this is just for reference
    /// </summary>
    /// <value>The field value.</value>
    public string FieldValue { get; set; }
    /// <summary>
    /// Incase of using string for fieldvalue, the string to format the value as per the required datatype 
    /// will be provided here.
    /// </summary>
    /// <value>The field value format string.</value>
    public string FieldValueFormatString { get; set; }
}

public class BaseModel
{
    Dictionary<string, ExtendedField> ExtendedRows { get; set; }
}

public class Ticket : BaseModel
{
    public int Id { get; set; }
    public string Description { get; set; }
    public DateTime CreationDate { get; set; }
}

在您的服务层中,将有用于填充这些扩展行的逻辑。最好具有用于填充扩展行的通用逻辑,以便对于任何数量的实体,此逻辑都可以重用。

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55322140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档