首页 > 解决方案 > 将数据保存在 JSON 中与 MySQL 中的独立列

问题描述

我正在为我的网站设计数据库模式。我有一个job_history包含工作相关信息的表。这是表结构:

CREATE TABLE IF NOT EXISTS `website`.`job_history` (
  `job_history_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT UNSIGNED NOT NULL,
  `designation` VARCHAR(255) NULL,
  `started` DATE NULL,
  `left` DATE NULL,
  `work_summary` VARCHAR(3000) NULL,
  `company_id` INT UNSIGNED NULL,
  `looking_job_change` TINYINT(1) NULL,
  PRIMARY KEY (`job_history_id`),
  INDEX `fk_job_employment_company1_idx` (`company_id` ASC),
  CONSTRAINT `fk_job_employment_company1`
    FOREIGN KEY (`company_id`)
    REFERENCES `website`.`company` (`company_id`)
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB

我感到困惑的是:既然 MYSQL 现在具有 JSON 的强大功能,为什么我不应该在 JSON 中放置几列。例如designation, started, left,work_summary 是一种元数据字段,仅解释不会(或非常不可能)使用WHERE子句搜索的详细信息(工作)。如果要搜索它们(很少),MySQL 也有很好的支持功能。

为什么不将它们作为JSON数据类型:

{
  "work": {
    "designation": "developer",
    "started": "may, 2018",
    "left": "june, 2019",
    "summary": "I was a software developer here"
  }
}

新结构将是:

CREATE TABLE IF NOT EXISTS `website`.`job_history` (
  `job_history_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT UNSIGNED NOT NULL,
  `work` JSON NULL,
  `company_id` INT UNSIGNED NULL,
  `looking_job_change` TINYINT(1) NULL,
  PRIMARY KEY (`job_history_id`),
  INDEX `fk_job_employment_company1_idx` (`company_id` ASC),
  CONSTRAINT `fk_job_employment_company1`
    FOREIGN KEY (`company_id`)
    REFERENCES `website`.`company` (`company_id`)
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB

为什么我想这样做?- 从前端添加新字段很容易,甚至无需接触数据库。假设将来我想添加一个新字段:why you left在前端。我什至不需要更改表结构。

以这种方式使用它有什么优点和缺点?

请提出您宝贵的意见。谢谢

标签: mysql

解决方案


推荐阅读