c# - 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 应用程序。
我相信我可以像这样管理它,让他们存储他们需要的任何东西,但我也在考虑以下问题:
当用户需要使用 Id 和外键链接表时,我将如何管理关系。(我虽然关于管理 a
public long ForeignId {get;set;}
并只存储他们需要关联的 ID)。我将如何管理查询,因为表将具有代码名称,并且每个设置它的人都有不同的含义。(我想在运行时重命名表,但我害怕错误和数据库损坏)。
还考虑过根据用户的需要发送直接查询来创建数据库,但是再一次没有经验的用户真的会在这里搞砸或很难管理。
如何使用代码而不是使用 PowerShell 控制台来管理迁移或数据库更改。
如果我们有多个用户,每个用户都有一个唯一的数据库,但是同一个 web 应用程序,我们如何管理 webconfigs 来实现这个想法。
我知道这里有很多问题,我正在寻找实现这一目标的最佳方法,让多个用户使用 MVC 模式通过 Internet 拥有他们的小型 Web 应用程序,并通过浏览器提供许多选项。
解决方案
我建议使用实体属性值 (EAV)模式作为解决方案。使用 EAV 模式,不是为您希望存储的每个自定义属性创建具有新列的新表,而是将这些属性存储在行中。例如。而不是像这样定义每个自定义表:
您可以这样定义它们:
这允许灵活地创建具有多个属性的多个实体。然后,您的业务逻辑中的类将是具有属性对象集合的实体类。
如果您还没有发现权衡,使用 EAV 模型的限制是无法指定字段类型(int、varchar、decimal 等),事实上,您的所有属性值都将存储为单一类型(通常是字符串)。
有很多方法可以解决这个问题。有些处理业务逻辑中的所有验证等,另一些则为每种类型创建 Field 表,因此根据我的示例,您将拥有多个按类型分隔的 EntityFields 表,而不是只有一个 EntityFields 表。
推荐阅读
- flutter - 第一次安装应用程序它运行良好,但是当我重新安装应用程序时,它给了我这个颤振错误
- javascript - 窗口化 ar.js 不是全屏
- swiftui - ForEach 循环的多个工作表
- java - 如何根据布尔值制作开关盒?[具体基于 char.isLetterOrDigit()]
- python - 尝试使用命令删除角色
- sitecore - 在 Solr 中对内容进行排序和存储
- javascript - 返回一个函数,该函数在调用时递增并返回一个计数器变量
- swift - 当我更改语言时,UICollectionView 标题不会从左到右改变它的方向,但它仅在重新启动应用程序时才有效
- c++ - 为什么会反复打印****?
- c - 为什么 fgets() 和 fread() 不能在我的 while 循环中正确替换 scanf()?