mysql - 将数据保存在 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
在前端。我什至不需要更改表结构。
以这种方式使用它有什么优点和缺点?
请提出您宝贵的意见。谢谢
解决方案
推荐阅读
- r - R - 如何以更有效的方式清理 REGEX
- r - R - 检查日期范围是否包含某个值,使用来自不同数据框的日期
- lc3 - 你会如何在像 Pennsim 这样的 LC-3 模拟器中画一条垂直线?
- encryption - 使用 RSA 算法对字母进行加密
- python - 融化包含字典列的熊猫数据框,以便字典值也被融化
- javascript - 推送后数组索引返回未定义 - Papa Parse
- sql - Row_Number Sybase SQL Anywhere 在多个条件下更改
- python - 将布尔数组(即 True False)转换为实际值?
- bash - 如何使用awk在bash中的字符串中查找字符
- c - C中的Dijkstras算法实现给出错误(但几乎正确)的输出