C#ASP.NET核心构建动态表单

use*_*430 8 c# sql-server office365 asp.net-core asp.net-core-1.0

我想实现像SharePoint在线类似的东西,这就是列表功能.我想创建动态列表添加新列等.用户可以填写表单并保存数据.

瓶颈是数据库,我很难理解应该如何构建它.

我正在考虑创建动态SQL Server表,列等,但也许这不是一个好方法.有人可以建议数据库应该是什么样的吗?

我正在考虑创建一个名为的表Lists,并存储List属性.然后与另一个表的多对多关系调用Fields,我可以存储与特定表单相关的所有字段.多对多的关系因为某些字段对于所有形式都是通用的,例如:Id,CreatedBy,Created,Modified,ModifiedBy等.现在是困难的部分.我应该在哪里存储实际数据?我应该创建另一个名为FormData并存储数据的表吗?ListsFields桌子有什么关系?

Fab*_*bio 7

NoSql方法似乎很简单.如果您认为数据库仅作为IO设备(不应包含任何"业务"逻辑),内存成本和内存读/写时间(SSD)变低,那么您的出价将更少.

例如,您可以将字段的集合保存在一个对象中

{
    "key": "form1",
    "fields" : [ "Id", "CreatedAt" ]
}
Run Code Online (Sandbox Code Playgroud)

基于该对象,您可以使用列表或创建的字段形式生成视图.您可以为字段引入自己的"对象",以获得视图生成和数据处理所需的更多数据.

{
    "key": "form1",
    "fields" : [ 
        { "Name": "Id", "Type": "string" }, 
        { "Name" "CreatedAt", "Type": "DateTime" } 
    ]
}
Run Code Online (Sandbox Code Playgroud)

实际数据也可以保存在一个对象中

{
    "formKey": "form1",
    "Name": "FirstName LastName",
    "CreatedAt": "2017-04-23T18:25:43.511Z"
}
Run Code Online (Sandbox Code Playgroud)

在客户端,这些数据可以很容易地保存为json对象并发送到服务器.
在服务器端,您可以反序列化该对象,Dictionary<string, object>并以动态方式处理它

var formEntity = JsonConvert.DeserializeObject<Dictionary<string, object>>(requestBody);

var name = formEntity["Name"].ToString();
Run Code Online (Sandbox Code Playgroud)

如果您紧密附加到关系数据库,则可以将"raw json"保存在NVARCHAR列和一个标识列中.
为了处理数据,您可以将其反序列化为Dictionary<string, object>.
使用字段对象,{ "Name" "CreatedAt", "Type": "DateTime" }您可以将值转换为期望的类型,以进行正确的验证和处理.

您将能够基于动态字段搜索数据并创建动态报告,用户可以在其中创建自己的报告.

由于字段结构不动态,您可以以关系方式保存表单和字段结构.以下是我对sql server数据库的建议.

CREATE TABLE Forms (
    Id INT IDENTITY(1,1) NOT NULL
)

CREATE TABLE Field(
    Id INT IDENTITY(1,1) NOT NULL,
    Name NVARCHAR(30) NOT NULL,
    TypeName NVARCHAR(30) NOT NULL, -- Or INT -> can represent SqlDbType enum in c#
)

-- many to many relation of Form and Fields
CREATE TABLE FormFields (
    FormId INT NOT NULL,
    FieldId INT NOT NULL,
    PRIMARY KEY (FormId, FieldId)
)

-- because data is "dynamic" it should be saved  as string (json format)
CREATE TABLE FormData(
    Id INT IDENTITY(1,1) NOT NULL,
    FormId INT NOT NULL,
    Data NVARCHAR(MAX) NOT NULL, -- json format
)
Run Code Online (Sandbox Code Playgroud)

并考虑使用Microsoft版本的NoSql - DocumentDB