Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 应用程序的用户定义数据模式_Database_Database Design_Dsl - Fatal编程技术网

Database 应用程序的用户定义数据模式

Database 应用程序的用户定义数据模式,database,database-design,dsl,Database,Database Design,Dsl,我想编写一个应用程序,允许用户定义自己的数据库模式。用户使用DSL(生物学实验)提供定义,并在此基础上生成oop/实体关系模型。后端应该是一个RDBMS,比如Postgres 最好的方法是什么 我可以从头顶上看到两种可能的方式: 将类型映射到SQL表,就像编写基于Django或Hibernate的应用程序一样。对象然后映射到表行 描述“类型”表中的类型和另一个表中的对象 人们通常在这里做什么?对于1,权限管理等可以交给rdbms。然而,如何在这里跟踪更改并允许回滚 有人能告诉我最佳实践吗?最佳实

我想编写一个应用程序,允许用户定义自己的数据库模式。用户使用DSL(生物学实验)提供定义,并在此基础上生成oop/实体关系模型。后端应该是一个RDBMS,比如Postgres

最好的方法是什么

我可以从头顶上看到两种可能的方式:

  • 将类型映射到SQL表,就像编写基于Django或Hibernate的应用程序一样。对象然后映射到表行
  • 描述“类型”表中的类型和另一个表中的对象
  • 人们通常在这里做什么?对于1,权限管理等可以交给rdbms。然而,如何在这里跟踪更改并允许回滚


    有人能告诉我最佳实践吗?

    最佳实践在很大程度上取决于应用程序的具体需求。例如,如果您正在编写一个具有技术悟性和值得信赖的用户的应用程序生成器,那么选项1是合适的。例如,这就是PeopleSoft应用程序设计器采用的方法。跟踪更改并允许回滚是一件棘手的事情,因为您无法回滚删除的列之类的内容。您可以使用自定义审计表编写一些复杂的安排,以跟踪所做的事情,并使用逻辑使其可逆。但删除该列仍会丢失数据。如果不考虑存储,您可以在每次更改时为表创建一个备份副本,回滚只需恢复该备份即可。但是,这样做可能会丢失在更改和回滚之间添加到表中的数据


    另一方面,如果您正在创建的更像一个调查生成器,那么我已经做了一些类似于选项2的事情。保留一个元数据表,显示“记录”是什么。记录本身实际上存储在两个表中—父表和子表。父表标识记录,但所有字段都作为键值对存储在子表中。您可以完全灵活地存储所需的任何内容,并且不必动态更改数据库模式。您甚至可以保留元数据的历史版本,这样您就可以始终引用历史记录而不丢失数据。

    有许多选项,实际上比您提供的选项多得多

    不要执行选项1动态创建表/模式真的很奇怪,除非您正在编写一个通用数据库客户端,如TOAD或RAD工具。听起来这不是你想要构建的,但是如果你只是使用现有的一个。当然,您可以动态地创建所有类、映射信息和脚本,但目的是什么?无论如何,您必须使用反射来使用它们,因为在编写程序时它们并不存在

    不要使用RDBMSRDBMS背后的思想是它或多或少有一个固定的模式。如果这不符合你的需要,不要这样做。使用更具活力的东西。像MongoDb这样的NoSql数据库可能适合您的需要。如果回滚非常重要,那么可以使用git存储库作为后端


    可能是数据仓库?你说的是“实验”。所以,如果你必须存储测量值,这可能只是:测量值,它们将有一个类型和一个实验,它们属于。。。有点像选项2。要了解更多信息,您可能需要查找“星型模式”

    您想要解决的实际问题是什么?您需要一个RDBMS、一个oop/实体关系模型、权限管理、跟踪更改、允许回滚。但是您几乎没有暗示您创建的目的。用户提供DSL是一个固定的需求吗?例如,它可能是某种XML或JSON吗?