MySQL能源系统建模数据库EAV设计

时间:2018-05-04 19:16:21

标签: mysql pyqt julia

我们正在为开源能源系统优化项目设计数据库架构。

我们正在使用EAV模型,因为我们希望它具有灵活性并允许通过数据定义问题。即我们希望能够动态创建与它们相关的新对象类和数据参数,而无需更改数据库结构。

该模型将在Julia JuMP中实现,我们将通过sql查询数据。将有一个与Julia的接口通过SQL访问数据和PyQT中的GUI来查看,编辑和过滤数据。

我已经为下面的当前架构提供了SQL。

这个想法很简单......和object_class表来定义对象的类型。用于定义对象实例的对象表和用于定义可与每种类型的对象关联的参数的parameter_definition表,以及用于定义与对象实例关联的参数的实际值的参数表。让我们暂时忘记关系,以保持讨论简单。我也省略了我们将包含的id字段。

参数表有点细微差别,因为我们的优化模型是按时间顺序运行的时间模型 - 因此,时变数据非常常见。为了解决这个问题,我们可以提供一个" time_pattern"到数据值。我们的模型也会有场景。在参数表中,我们可以设置此值以指示参数值适用于特定方案。场景字段中的NULL表示"基本情况"数据项。

现在紧急......团队成员已经想到用对象表中的JSON字段替换参数表。他确信这样做更好,因为对象的所有数据都包含在此中,它避免了在没有指定时间模式或场景时我们将在参数表中使用的空值。但是,我有很多问题:  1.我们失去了参数表和参数定义表之间的参照完整性。我知道你可以链接JSON字段,但效率不高吗?  2.如果我们假设每个对象都有一个静态的参数列表(即没有定义time_pattern或场景,那么这个想法可能有一些优点。但是,当定义这些参数时,我们需要在其中嵌套JSON。对象表的JSON字段。我们可以加入吗?  3.根据我的阅读,在JSON字段内隐藏您可能想要查询的任何字段并不是一个好习惯。它是否正确?  4.甚至可以在嵌套JSON中的字段上加入,如果可以,它是否效率低下?  5.即使您可以查询和加入嵌入在嵌套JSON中的字段,也不会因为没有实际收益而变得复杂吗?

对我来说,表面上看,唯一的优势就是你摆脱了一个可以简化某些调用的表。但是,您只是将该表的数据隐藏在另一个表中的JSON字段中

我错过了什么吗?我没有得到这个提案的好处吗?

由于数据将被集体查询到Julia,这个元素可能并不关心,JSON或者没有...但PyQT Gui会有数据过滤等......这个代码可能会非常复杂?

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`class_category` (
  `name` VARCHAR(255) NOT NULL,
  `description` VARCHAR(255) NULL DEFAULT NULL,
  PRIMARY KEY (`name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`object`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`object` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`object` (
  `class_name` VARCHAR(155) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `description` VARCHAR(255) NULL DEFAULT NULL,
  `category_name` VARCHAR(255) NULL DEFAULT NULL,
  PRIMARY KEY (`class_name`, `name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`object_category`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`object_category` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`object_category` (
  `object_class_name` VARCHAR(255) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `description` VARCHAR(255) NULL DEFAULT NULL,
  PRIMARY KEY (`object_class_name`, `name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`object_class`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`object_class` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`object_class` (
  `name` VARCHAR(255) NOT NULL,
  `description` VARCHAR(255) NULL DEFAULT NULL,
  `category_name` VARCHAR(155) NULL DEFAULT NULL,
  `display_order` INT(11) NULL DEFAULT '99',
  `display_icon` INT(11) NULL DEFAULT NULL,
  `hidden` TINYINT(1) NULL DEFAULT '0',
  PRIMARY KEY (`name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`parameter`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`parameter` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`parameter` (
  `object_name` VARCHAR(155) NOT NULL,
  `name` VARCHAR(155) NOT NULL,
  `index` TINYINT(2) NULL DEFAULT '1',
  `value` VARCHAR(155) NULL DEFAULT NULL,
  `expression` VARCHAR(255) NULL DEFAULT NULL,
  `time_pattern` VARCHAR(155) NULL DEFAULT NULL,
  `deterministic_timeseries_id` VARCHAR(155) NULL DEFAULT NULL,
  `stochastic_timeseries_id` VARCHAR(155) NULL DEFAULT NULL,
  `stochasticmodel_id` VARCHAR(155) NULL DEFAULT NULL,
  `comment` VARCHAR(255) NULL DEFAULT NULL,
  PRIMARY KEY (`object_name`, `name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`parameter_definition`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`parameter_definition` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`parameter_definition` (
  `name` VARCHAR(155) NOT NULL,
  `description` VARCHAR(155) NULL DEFAULT NULL,
  `data_type` VARCHAR(155) NULL DEFAULT 'NUMERIC',
  `object_type` VARCHAR(155) NOT NULL,
  `object_class_name` VARCHAR(155) NOT NULL,
  `CanHaveTimeSeries` TINYINT(1) NULL DEFAULT '0',
  `CanHaveTimePattern` TINYINT(1) NULL DEFAULT '1',
  `CanBeStochastic` TINYINT(1) NULL DEFAULT '0',
  `dafault_value` VARCHAR(155) NULL DEFAULT '0',
  `is_madatory` TINYINT(1) NULL DEFAULT '0',
  `precision` TINYINT(2) NULL DEFAULT '2',
  `minimum_value` DOUBLE(10,4) NULL DEFAULT NULL,
  `maximum_value` DOUBLE(10,4) NULL DEFAULT NULL,
  PRIMARY KEY (`object_class_name`, `name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`relationship`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`relationship` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`relationship` (
  `class_name` VARCHAR(155) NOT NULL,
  `name` VARCHAR(155) NOT NULL,
  `parent_object_name` VARCHAR(155) NOT NULL,
  `child_object_name` VARCHAR(155) NOT NULL,
  PRIMARY KEY (`class_name`, `name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `db1303628_spine`.`relationship_class`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `db1303628_spine`.`relationship_class` ;

CREATE TABLE IF NOT EXISTS `db1303628_spine`.`relationship_class` (
  `name` VARCHAR(155) NOT NULL,
  `parent_class_name` VARCHAR(155) NOT NULL,
  `child_class_name` VARCHAR(155) NOT NULL,
  `inheritance` VARCHAR(155) NULL DEFAULT NULL,
  `hidden` TINYINT(1) NULL DEFAULT '0',
  `type` INT(11) NULL DEFAULT NULL,
  PRIMARY KEY (`name`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

1 个答案:

答案 0 :(得分:0)

您可以使用

功能
common_schema.extract_json_value(json_data,'title')

要在列中查询JSON,但正如我上面所说的那样它效率低下,并且排除使用索引/使用SQL强大的所有东西。听起来他只是想对他的疑问感到懒惰。完全没有理由存储应以JSON格式列为表/列的信息。