EAV or JSON

MongoDB 之类的 NoSQL 之所以流行,很大程度上取决于相对自由的 schema 设计,不管数据量多大,可以随时在线上环境添加新字段来保存新数据,而这种能力恰恰是传统的关系数据库所欠缺的,不过别担心,传统关系数据库有自己的应对之道。我们今天就讨论一下其中最具代表性的两种方法,看看孰优孰劣。

在讨论前,我们不妨虚拟一个业务场景:假设我们要做一个类似汽车之家的产品库,首当其冲的是如何保存汽车的各种属性,比如说:长度、宽度、高度、GPS 导航系统、倒车影像、上坡辅助、陡坡缓降等等,最传统的方法是每一个属性都用一个独立的字段来保存,不过这样有问题:汽车属性有可能非常多,如此一来我们的表需要创建几十甚至上百个字段,而且以后还可能想要不断的添加新字段。最要命的是不同的汽车拥有的属性大不相同,比如有的汽车有 GPS 导航系统、倒车影像,但是却没有上坡辅助、陡坡缓降,如果把这些属性统统作为字段存在的话,那么表就是稀疏的,存在很多空值。

传统的 EAV 方法

所谓 EAV,实际上是 Entity–Attribute–Value 的缩写。它的核心思想是把原本按列保存的数据转换成按行保存。不同的项目设计在表结构上可能会有些许差异,不过核心通常就是 entity,attribute,value 三张表,下面看看采用 EAV 如何解决问题:

CREATE TABLE eav_entities (id INT UNSIGNED NOT NULL AUTO_INCREMENT,entity_name VARCHAR(100) NOT NULL,PRIMARY KEY(id)
);INSERT INTO `eav_entities`(`id`, `entity_name`)
VALUES(1,'普拉多 3.5L TX-L'),(2,'帕杰罗 3.0L 豪华版');CREATE TABLE eav_attributes (id INT UNSIGNED NOT NULL AUTO_INCREMENT,attribute_name VARCHAR(100) NOT NULL,PRIMARY KEY(id)
);INSERT INTO `eav_attributes`(`id`, `attribute_name`)
VALUES(1,'长度'),(2,'宽度'),(3,'高度'),(4,'GPS 导航系统'),(5,'倒车影像'),(6,'上坡辅助'),(7,'陡坡缓降');CREATE TABLE eav_values (id INT UNSIGNED NOT NULL AUTO_INCREMENT,entity_id INT UNSIGNED NOT NULL,attribute_id INT UNSIGNED NOT NULL,attribute_value VARCHAR(100) NOT NULL,PRIMARY KEY(id)
);INSERT INTO `eav_values`(`id`, `entity_id`, `attribute_id`, `attribute_value`)
VALUES(1,1,1,'4780'),(2,1,2,'1885'),(3,1,3,'1890'),(4,1,6,'有'),(5,1,7,'有'),(6,2,1,'4900'),(7,2,2,'1875'),(8,2,3,'1900'),(9,2,4,'有'),(10,2,5,'有');

在 EAV 模型中查询巨麻烦,主要特征就是不停的 JOIN 连表:

EAV

随便说一句,前些天途牛介绍的运维系统就是利用 EAV 设计的。

新锐的 JSON 方法

现在的关系数据库已不在是单纯的关系数据库了,很多时候视情况可以打破范式的束缚,主流的 MySQL 和 PostgreSQL 都已经支持 JSON 数据类型,以 MySQL 为例:

CREATE TABLE entities (id INT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL,data JSON NOT NULL,PRIMARY KEY(id)
);INSERT INTO `entities`(`id`, `name`, `data`)
VALUES(1,'普拉多 3.5L TX-L','{"Length": 4780,"Width": 1885,"Height": 1890,"HAC": "有","HDC": "有"}'),(2,'帕杰罗 3.0L 豪华版','{"Length": 4900,"Width": 1875,"Height": 1900,"GPS": "有","ReverseImage": "有"}');

和 EAV 的相比,少了 JOIN 的累赘,简单的想哭:

JSON

如果你使用的关系数据库不支持 JSON 数据类型,那么你可能倾向于使用 EAV 来保存动态数据,但是只要条件允许,还是尽可能使用 JSON 为妙,不过 JSON 虽好,却万万不可滥用,如果我们不加区分的把大部分数据都放到一个 JSON 字段里去,那还不如直接用 MongoDB 算了,更详细的说明大家可以参考 2ndquadrant 中的介绍。当然对付动态数据,不止有 EAV 和 JSON,比如 FriendFeed 看似奇葩的做法,就不多说了。

本文转载自:火丁笔记

【技术晨读】EAV or JSON相关推荐

  1. 技术晨读_2014_9_1

    #技术晨报# NoSQL反模式 – 文档数据库篇 文章说的是关系型数据库怎么转换为文档型数据库,比如mongoDB... http://blog.nosqlfan.com/html/4156.html ...

  2. 技术晨读积累_20140526

    技术晨读积累_20140526 2014-05-26 09:34 by 轩脉刃, ... 阅读, ... 评论, 收藏, 编辑 #技术晨读# 初探单点登录 SSO 在多个应用中,如果你登录了其中一个应 ...

  3. 晨读一年的复盘会议_一年后,在家中远程办公,网真和视频会议

    晨读一年的复盘会议 Had my one year review at work last week. I met with my boss for an hour and we talked abo ...

  4. 【经济学_04】晨读:保险的实质 特效药 医疗膨胀 保险的发明

    文章目录 晨读:保险的实质 情景 认知 本质 Q1:那么保险是资产还是负债呢? Q2:富人也喜欢保险? 对于企业来说保险的好处 无时无刻都在接触保险 为什么说,越穷的人越需要配保险 保险特点 特点1: ...

  5. java技术晨讲可以讲什么内容,晨讲和晨测都是提升郑州达内小伙们技能的好方法...

    一年之计在于春,一天之计在于晨.报读郑州达内IT培训班的小伙伴们,你们准备好了吗,是否想要在这里找到人生的起点呢,还等什么呢,加油吧! 一年之计在于春,万物复苏,生机勃勃,在春天的见证下努力的成长,而 ...

  6. 外刊晨读 2018 年 年 5 月 月 15 日

    外刊晨读 2018 年 年 5 月 月 15 日 Artificial Intelligence in Business 商业中的人工智能 GrAIt Expectations 远大前程 LIE DE ...

  7. 【晨读】热爱 ▪ 英语 @ 热爱 ▪ 晨读

    未曾开言,我先扯皮,扯皮完了,听我讲一讲经历 这是一次非常舒服的晨读. 用李光的话来说的话就是:贼得劲儿!!! 恩.是的,贼得劲儿. 不过,接下来,可能是很朴实的一些文字,可能你会觉得没意思透了.但是 ...

  8. 初中晨读必看古诗名句

    初中晨读必看古诗名句[篇一] 1.笔落惊风雨,诗成泣鬼神.(唐•杜甫•寄本十二白二十) 2.墙头雨细垂纤草,水面风回聚落花. -- 张蠙<夏日题老将林亭> 3.流连戏蝶时时舞,自在娇莺恰恰 ...

  9. 晨读美文推荐【英文悦读】-《a day so happy》

    晨读美文推荐[英文悦读]-<a day so happy> a day so happy. 愉快的一天. Fog lifted early. i worked in the garden. ...

最新文章

  1. linux中根目录下各个目录的作用
  2. GPUImage滤镜之锐化
  3. Lite-HRNet
  4. C语言--switch case语句
  5. [USACO4.2]完美的牛栏The Perfect Stall
  6. SpringBoot项目打成jar包后,无法读取resources下的文件
  7. 二元运算 FFT+分治
  8. 很强势!因拒绝退回用户保证金,知名在线旅游平台成“老赖”,回应...
  9. 单台电脑运行多个 Tomcat 服务器
  10. 用友nc的java插件下载,用友nc插件下载|
  11. 各种数据集汇总——转载而来
  12. 越狱团队否认收钱并中止与太极合作
  13. android stop 服务,当调用stopService方法时服务不会停止
  14. 识人 用人 激人 留人 斩人
  15. Hyper-V虚拟机网络配置
  16. 如何用QGIS 3.22将遥感影像切割成小矩形图片(机器学习数据)
  17. 浅谈:APP开发市场的发展轨迹与未来趋势
  18. Cay S.Horstmann:从Java新特性看Java的未来
  19. word里双横线怎么打_字体下方的双横线怎么弄 word蓝色双横线
  20. 润和软件助力深圳集成电路应用开发职业技能竞赛圆满收官

热门文章

  1. Python双端队列之回文词判定
  2. KSO-docker命令大全,基于Linux服务器CentOS7.5 安装docker
  3. python时钟代码_python时钟 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
  4. matlab能输入铁心参数,变压器铁心剩磁预测研究
  5. 一些RJS资源和演示入门教程
  6. 互联网摸鱼日报(2023-01-11)
  7. 数学建模算法与应用 线性规划(cvxpy包)
  8. 幼儿园小游戏:小兔种萝卜
  9. GIT CZ的错误解决
  10. JMeter 5.0安装配置(win10)