首页 > 解决方案 > C# MVC - 动态数据库架构

问题描述

我有一个 Web 应用程序的想法,我希望用户通过 Web 应用程序创建自己的数据库,并使用他们自己的表名和字段类型。

我考虑过使用面向对象编程创建一个数据库结构,以便预制数据库支持各种具有自定义属性的实体。像这样的东西:

CustomType
{
    public long TypeId {get;set;} 
    public string ActiveType {get;set;}
}

CustomProperty
{
    public int wholeNumber {get;set;}
    public string text {get;set;}
    public bool boolean {get;set;}
    public decimal dec {get;set;}

    //Choosen Id of the type to work with
    public long TypeId {get;set;}

    public bool wholeNumber_ACTIVE {get;set;}
    public bool text_ACTIVE {get;set;}
    public bool boolean_ACTIVE {get;set;}
    public bool dec_ACTIVE {get;set;} 
}

CustomEntity
{
    public string TableName {get;set;}
    public CustomProperty Prop01 {get;set;}
    public CustomProperty Prop02 {get;set;}
    public CustomProperty Prop03 {get;set;}
    public CustomProperty Prop04 {get;set;}
    public CustomProperty Prop05 {get;set;}
}

这背后的想法是让用户决定他们希望他们的数据库存储什么,在一个预制的数据库上供他们使用,而无需在运行时创建它,因为这是一个 Web 应用程序。

我相信我可以像这样管理它,让他们存储他们需要的任何东西,但我也在考虑以下问题:

  1. 当用户需要使用 Id 和外键链接表时,我将如何管理关系。(我虽然关于管理 apublic long ForeignId {get;set;}并只存储他们需要关联的 ID)。

  2. 我将如何管理查询,因为表将具有代码名称,并且每个设置它的人都有不同的含义。(我想在运行时重命名表,但我害怕错误和数据库损坏)。

  3. 还考虑过根据用户的需要发送直接查询来创建数据库,但是再一次没有经验的用户真的会在这里搞砸或很难管理。

  4. 如何使用代码而不是使用 PowerShell 控制台来管理迁移或数据库更改。

  5. 如果我们有多个用户,每个用户都有一个唯一的数据库,但是同一个 web 应用程序,我们如何管理 webconfigs 来实现这个想法。

我知道这里有很多问题,我正在寻找实现这一目标的最佳方法,让多个用户使用 MVC 模式通过 Internet 拥有他们的小型 Web 应用程序,并通过浏览器提供许多选项。

标签: c#model-view-controller

解决方案


我建议使用实体属性值 (EAV)模式作为解决方案。使用 EAV 模式,不是为您希望存储的每个自定义属性创建具有新列的新表,而是将这些属性存储在行中。例如。而不是像这样定义每个自定义表:

在此处输入图像描述

您可以这样定义它们:

在此处输入图像描述

这允许灵活地创建具有多个属性的多个实体。然后,您的业务逻辑中的类将是具有属性对象集合的实体类。

如果您还没有发现权衡,使用 EAV 模型的限制是无法指定字段类型(int、varchar、decimal 等),事实上,您的所有属性值都将存储为单一类型(通常是字符串)。

有很多方法可以解决这个问题。有些处理业务逻辑中的所有验证等,另一些则为每种类型创建 Field 表,因此根据我的示例,您将拥有多个按类型分隔的 EntityFields 表,而不是只有一个 EntityFields 表。


推荐阅读