Database design 处理通用UI屏幕的3NF数据的动态数据集配置

Database design 处理通用UI屏幕的3NF数据的动态数据集配置,database-design,Database Design,我正在与一个客户合作,该客户拥有一个桌面windows应用程序套件,其数据库包含特定于每个客户的GIS相关数据(即调查结果、程序、检查等)。数据是3NF格式的,对于客户端来说,数据的任何进一步规范化都是不可能的。客户机的应用程序套件的设计使其所有客户只需一次安装,任何定制都要通过与每个客户关联的元数据和配置表来完成。每个客户对问题域、实体、字段等都有自己的术语。;此外,每个客户的数据集在移交给用户界面的内容方面是不同的。一天结束时,用户界面将收到两个参数,一个字典(列名、列显示)和一个数据集(数

我正在与一个客户合作,该客户拥有一个桌面windows应用程序套件,其数据库包含特定于每个客户的GIS相关数据(即调查结果、程序、检查等)。数据是3NF格式的,对于客户端来说,数据的任何进一步规范化都是不可能的。客户机的应用程序套件的设计使其所有客户只需一次安装,任何定制都要通过与每个客户关联的元数据和配置表来完成。每个客户对问题域、实体、字段等都有自己的术语。;此外,每个客户的数据集在移交给用户界面的内容方面是不同的。一天结束时,用户界面将收到两个参数,一个字典(列名、列显示)和一个数据集(数据集中的列名与字典参数中的列名条目匹配的标准列和行结构)

现在,客户机当前实现的解决方案是有一个“customer resultset”表(用于ViewModel/控件查找与特定UI视图的客户关联的数据集)、一个“column display”表(用于指定datatable、columnname、column displayname)以及最后一个“Xref”表来维护“customer resultset”和“column display”之间的多对多关系,以及定义的结果集中涉及的表的联接条件。这种实现的关键限制是系统速度慢,因为没有在任何地方定义对结果集的实际查询;因此,通过查看结果集中涉及的所有表、数据库定义的外键/约束以及“Xref”表中的连接条件,在结果的单个执行时动态编译数据查询


考虑到除非结果集定义更改,否则查询不会更改;在我看来,避免在执行查询之前发现查询的开销似乎是解决性能问题的一个自然起点,即将查询保存在某个地方。我有什么选择?我考虑过在每次定义“customer resultset”时生成/更改数据库视图,或者将实际查询存储在某个列中。这些方法的利弊?将SQL查询的语法存储在SQL数据库列中是否可以接受?提前感谢您的反馈

我想你自己已经回答了这个问题。根据您的数据库和客户端代码平台,其中一种可能在性能、可维护性和可服务性方面作为最佳解决方案应用。这是一个典型的元数据问题。例如,考虑关系数据库的数据字典;每个列都存储元数据

在这种情况下,您不想编写自己的数据库引擎(如果您有足够的资源,这可能是另一个选项:-),而是在一个虚拟机上模拟此关系数据库,该虚拟机恰好是一个具有某些过程可能性的关系数据库(至少在客户端,可能是服务器端)

我们自己维护一个类似的包,并拥有一个存储定义的存储库。根据应用程序的类型和需求,我们可以选择:

  • 在编译时生成代码(DDL和视图),是的,这包括存储在列定义中的SQL查询语法(在我们的例子中是VIEWITGEN_view_columns_v)。这可能是非常复杂到非常复杂的代码,因为在我们的例子中,它包含许多针对目标平台的优化
  • 在运行时生成代码并使其在一段时间内保持有效。这通常不是很好,因为在数据库环境中动态生成代码需要数据库服务器努力进行解析,可能还需要维护自身的数据字典(DDL)
  • 完全运行时评估存储库并自动调整。这通常是在客户端完成的,因为大多数数据库引擎的过程性扩展执行得不太好,也没有像C#或Java这样的库和工具随OO一起提供,尽管过程性扩展对于数据密集型操作非常方便
  • 在某些特定情况下,使用数据模型扩展进行手工编码(例如,在我们的示例中,您可以将自己的具有特定属性的字段添加到例如logistics中的product中)

在你的情况下,我可能只是在一个数据库平台上运行时生成数据库视图(查询会更快),或者在所有其他情况下解释客户端的所有内容。

@Joanniebrar:这篇文章对你有帮助吗?如果是,请接受,否则请澄清。