我们正在为一个开源能源系统优化项目设计一个数据库模式。
我们使用eav模型是因为我们希望它具有灵活性,并且允许通过数据定义问题。i、 e.我们希望能够动态地创建新的对象类和与之相关联的数据参数,而不必更改数据库结构。
该模型将在juliajump中实现,我们将通过sql查询数据。将有一个与julia的接口,通过sql访问数据,并在pyqt中有一个gui来查看、编辑和过滤数据。
我在下面给出了当前模式的sql。
想法很简单。。。和对象类表来定义对象的类型。用于定义对象示例的对象表和用于定义可与每种类型的对象关联的参数的参数定义表,以及用于定义与对象示例关联的参数的实际值的参数表。让我们暂时忘掉关系,让讨论保持简单。我还省略了我们将包括的id字段。
参数表有点细微差别,因为我们的优化模型是随时间变化的按时间顺序排列的模型,所以具有时变数据是非常常见的。为了处理这个问题,我们可以给数据值一个“时间模式”。我们的模型也会有一些场景。在参数表中,我们可以设置此值,以指示参数值适用于特定场景。scenario字段中的null表示“基本情况”数据项。
现在关键是。。。团队的一个成员已经想到用objects表中的json字段替换parameters表。他确信这样做更好,因为对象的所有数据都包含在这个表中,并且当没有指定时间模式或场景时,它避免了参数表中的空值。但是,我有一些问题:1。我们失去了参数表和参数定义表之间的引用完整性。我知道你可以链接json字段,但这不是效率低下吗?2如果我们假设每个对象都有一个静态的参数列表(即没有定义时间模式或场景),那么这个想法可能有一些优点。但是,当这些都被定义时,我们需要在objects表的json字段中有嵌套的json。我们能加入吗?三。据我所知,在json字段中隐藏任何可能需要查询的字段都不是好的做法。是这样吗?4甚至可以在嵌套json中的字段上进行连接吗?如果可以,效率是否很低?5即使您可以查询和连接嵌套json中的字段,sql不是很复杂吗?
对我来说,从表面上看,唯一的优势是你摆脱了一个表,这可能会简化一些调用。但是,您只是将该表的数据隐藏在另一个表的json字段中
我错过什么了吗?这个提议有没有我没有得到的好处?
因为数据将被大量地查询给julia,所以这个元素可能不关心,json或no。。。但是pyqt图形用户界面将有数据过滤等。。。这个代码可能非常复杂?
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条答案
按热度按时间czfnxgou1#
你可以使用这个函数
在列中查询json,但正如我前面所说的那样,它效率低下,并且排除了使用索引/所有使sql功能强大的东西。听起来他只是想偷懒一下。根本没有理由存储应该以json格式作为表/列的信息。