Когда вы разрешаете пользователям создавать модели данных, я бы рекомендовал просмотреть базу данных документов или «NoSQL», поскольку вы хотите именно это, чтобы хранить структуры данных без схемы.
Кроме того, sharePoint хранит метаданные так, как вы упомянули (10 столбцов для текста, 5 для дат и т. Д.)
Тем не менее, в моем текущем проекте (заблокирован в SharePoint, поэтому Framework 3.5 + SQL Server и все последующие ограничения) мы используем несколько похожую структуру, как показано ниже:
Form
Id
Attribute (or Field)
Name
Type (enum) Text, List, Dates, Formulas etc
Hidden (bool)
Mandatory
DefaultValue
Options (for lists)
Readonly
Mask (for SSN etc)
Length (for text fields)
Order
Metadata
FormId
AttributeId
Text (the value for everything but dates)
Date (the value for dates)
В наших формулах используются такие функции, как Increment: INC([attribute1][attribute2], 6)
, и это выдает что-то вроде 000999 для 999-го экземпляра объединенных значений для атрибута 1 и атрибута 2 для формы, это сохраняется как:
AttributeIncrementFormula
AtributeId
Counter
Token
Другие «формулы» (иначе нетривиальные), такие как штрих-коды, хранятся в виде отдельных значений метаданных. В реальной реализации у нас будет что-то вроде этого:
var form = formRepository.GetById(1);
form.Metadata["firstname"].Value
Значение выше - это свойство только для чтения, которое решает, следует ли нам получать значение из Text или Date и требуется ли какое-либо дополнительное преобразование. Обратите внимание, что база данных здесь просто хранилище, мы храним всю сложность домена в приложении.
Мы также позволяем нашему клиенту решить, какой атрибут, например, является заголовком формы, поэтому, если firstname
является заголовком формы, они установят параметр в памяти, который охватывает все приложение, как что-то вроде Params.InMemory.TitleAttributeId = <user-defined-id>
.
Надеюсь, это даст вам некоторое представление о сценарии аналогичного сценария.