ИМХО, в SaaS ключом к успеху является наличие единой кодовой базы и гибкой конфигурации / расширения для мультитенантности.
Чтобы включить настраиваемые поля для каждого арендатора, бизнес-модель должна иметь фиксированный набор базовых полей. Пользовательские поля должны быть сохранены entityid и tenantid в отдельной таблице.
Ваши таблицы могут выглядеть так, как показано ниже. Эта модель предпочтительна, так как наличие универсальной таблицы расширений приведет к меньшей масштабируемости и вскоре может быть заполнено объемом данных по мере увеличения использования.
Билет
TicketExtn (таблица расширений, содержащая настраиваемые поля по владельцам и сущностям)
Таблица TicketExtn
будет содержать поля типа
TicketId
TenantId
FieldId
FieldValue
FieldDataType
так далее
Когда мы попытаемся получить данные для сущности Ticket
, мы также получим данные из таблицы TicketExtn
и установим поля в модели.
BaseModel будет выглядеть так, как показано ниже
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; }
}
На вашем уровне сервисов будет логика для заполнения этих расширенных строк. Лучше иметь общую логику для заполнения расширенных строк, чтобы эту логику можно было повторно использовать для любого числа объектов.
НТН