关系型和非关系型数据库到底是什么意思呢关系型和非关系型怎么理解知道MySQL是关系型HBASE是非关系型理解了关系这两个字你就真正懂了数据库设计的核心思想。一、关系到底是什么意思1.1 一句话理解关系 表与表之间的连接线外键关联sql-- 用户表 CREATE TABLE user ( user_id INT PRIMARY KEY, name VARCHAR(50) ); -- 订单表通过user_id关联用户 CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, -- 外键指向user表 amount DECIMAL(10,2), FOREIGN KEY (user_id) REFERENCES user(user_id) );这就是关系订单表的user_id关联到用户表的user_id。二、用你的课堂笔记理解关键你之前的HBase笔记里有个图textrowkey info address 1001 {name:zhangsan, age:14} {province:guangdong, city:guangzhou} 1002 {name:lisi, sex:male} {area:binjiang, street:juyelu}这个图完美解释了区别维度关系型MySQL非关系型HBase数据组织拆成多个表用ID关联全部塞进一行不关联用户和地址分两张表用user_id关联写在同一行直接嵌套查询方式JOIN两张表一次GET就拿到所有三、具体例子对比场景存储用户和订单关系型MySQL做法sql-- 用户表 CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 订单表关联用户 CREATE TABLE orders ( id INT PRIMARY KEY, user_id INT, -- 外键建立关系 price DECIMAL(10,2) ); -- 查询需要两张表关联 SELECT user.name, orders.price FROM user JOIN orders ON user.id orders.user_id;非关系型HBase做法bash# 一行存完不用关联 rowkey 用户ID 列簇 info: - name: 张三 列簇 orders: - 20250529_001: 99.00 - 20250529_002: 128.00 - 20250530_003: 59.00 # 查询一次GET全拿到 get user_orders, 用户ID四、为什么叫关系型4.1 历史来源1970年IBM研究员埃德加·科德发表论文《大型共享数据库的关系模型》提出用数学中的关系Relation来组织数据。数学中的关系就是表格关系 一张二维表 例如 用户关系表 ┌─────┬──────┐ │ id │ name │ ├─────┼──────┤ │ 1 │ 张三 │ │ 2 │ 李四 │ └─────┴──────┘ 订单关系表 ┌─────┬─────────┬────────┐ │ id │ user_id │ amount │ ├─────┼─────────┼────────┤ │ 101 │ 1 │ 99.00 │ │ 102 │ 1 │ 128.00 │ └─────┴─────────┴────────┘这两个关系通过 user_id 建立联系 → 关系型数据库4.2 通俗理解说法解释学术说法基于关系模型的数据库通俗说法表之间可以用外键牵线搭桥的数据库你的理解数据可以拆开存需要用的时候再拼起来五、关系型 vs 非关系型 核心区别维度关系型MySQL非关系型HBase/Redis/MongoDB数据组织多个表用外键关联单张表或者用嵌套/聚合表结构列固定改结构麻烦列动态随时可加查询方式SQL支持JOINAPI主要按Key查事务支持支持ACID事务有限支持HBase只有行级扩展方式垂直扩展加硬件水平扩展加机器数据量GB~TB级别TB~PB级别典型代表MySQL、Oracle、PostgreSQLHBase、Redis、MongoDB六、什么场景用哪种判断标准用关系型MySQL的场景 ✅# 1. 数据之间有复杂关系 例如学生-课程-成绩-老师需要多表关联查询 # 2. 需要事务保证 例如银行转账A扣钱B加钱必须一起成功 # 3. 数据结构稳定 例如用户表字段基本不变 # 4. 数据量中等 例如公司ERP系统百万级数据用非关系型HBase的场景 ✅# 1. 数据量巨大 例如用户行为日志每天几十亿条 # 2. 查询简单主要按主键 例如查某个用户的近期行为 # 3. 列经常变化 例如用户画像标签今天加一个喜欢运动明天加一个高消费 # 4. 不需要复杂JOIN 例如物联网设备数据、日志存储七、一句话总结关系型 数据拆开存用ID牵线省空间但查询麻烦 非关系型 数据堆一起存按Key查占空间但查询快类比搬家 关系型 打包拆开床板、螺丝分开装省地方但组装费劲 非关系型 整体搬直接抬走费地方但省事 没有谁更好看你要省空间还是省时间八、常见混淆点澄清错误认知正确理解关系型就是有SQL对但不是本质非关系型就是没SQLHBase确实没SQL但有类似工具Phoenix关系型不能存大数据MySQL也能存亿级但HBase更适合百亿级非关系型不需要设计恰恰相反HBase的rowkey设计是关键HBase确实没SQL是什么意思这句话需要澄清一下因为容易产生误解。一、HBase确实没SQL 是什么意思准确理解HBase本身不支持SQL 语法你不能像 MySQL 那样写SELECT * FROM user WHERE age 18HBase 有自己的 API 和 Shell 命令二、具体对比MySQL 有SQL你熟悉的写法sql-- 这些都是SQL SELECT * FROM user; SELECT * FROM user WHERE age 18; INSERT INTO user VALUES (1, 张三, 28); UPDATE user SET age 29 WHERE id 1; DELETE FROM user WHERE id 1;HBase 没SQL实际写法bash# 这不是SQL是HBase Shell命令 scan user scan user, {FILTER ValueFilter(,binary:18)} # 没有简单的 WHERE put user, 1, info:name, 张三 put user, 1, info:age, 28 delete user, 1, info:age三、但是HBase 可以有 SQL通过中间层这就是容易混淆的地方方式1Apache Phoenix最常用sql-- 用Phoenix可以在HBase上写SQL CREATE TABLE user ( id INTEGER PRIMARY KEY, name VARCHAR, age INTEGER ); SELECT * FROM user WHERE age 18; -- 这就是SQL INSERT INTO user VALUES (1, 张三, 28);Phoenix 怎么做到的把 SQL 翻译成 HBase 的 API 调用你的 SQL 变成底层的get、scan、put方式2Hive 映射sql-- 在Hive中创建映射表用Hive SQL查HBase CREATE EXTERNAL TABLE user_hbase ( id STRING, name STRING, age STRING ) STORED BY org.apache.hadoop.hive.hbase.HBaseStorageHandler; SELECT * FROM user_hbase WHERE age 18; -- Hive SQL四、所以正确的理解是说法是否正确说明HBase 原生不支持 SQL✅ 正确原生 Shell 和 API 都没有 SQLHBase 不能用 SQL❌ 错误可以通过 Phoenix 等工具用 SQLHBase 没 SQL 容易误解应该说 原生不支持 SQL五、为什么 HBase 原生不提供 SQL原因说明设计哲学不同HBase 追求简单、高效的单行操作SQL 开销大解析 SQL、优化查询计划、执行引擎都需要资源适用场景不同HBase 主要做 KV 查询不需要复杂 SQL保持轻量去掉 SQL 层让 HBase 更专注存储六、面试怎么回答面试官HBase 支持 SQL 吗HBase 原生不支持 SQL它有自己的一套 Shell 命令和 Java API。但是如果想用 SQL 查 HBase可以搭配Apache Phoenix使用Phoenix 会把 SQL 翻译成 HBase 的底层操作。不过生产环境中如果业务需要复杂 SQL 查询通常会选择用 Hive 或者 Spark SQL 来查 HBase。七、一句话总结textHBase 原生没SQL但可以穿上外衣支持SQLPhoenix/Hive 就像 - 中国人不会说英语HBase没SQL - 但可以配个翻译Phoenix跟老外交流用SQL查HBase
关系型和非关系型数据库理解,什么是关系(关系 = 表与表之间的连接线(外键关联))
发布时间:2026/6/2 6:14:14
关系型和非关系型数据库到底是什么意思呢关系型和非关系型怎么理解知道MySQL是关系型HBASE是非关系型理解了关系这两个字你就真正懂了数据库设计的核心思想。一、关系到底是什么意思1.1 一句话理解关系 表与表之间的连接线外键关联sql-- 用户表 CREATE TABLE user ( user_id INT PRIMARY KEY, name VARCHAR(50) ); -- 订单表通过user_id关联用户 CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, -- 外键指向user表 amount DECIMAL(10,2), FOREIGN KEY (user_id) REFERENCES user(user_id) );这就是关系订单表的user_id关联到用户表的user_id。二、用你的课堂笔记理解关键你之前的HBase笔记里有个图textrowkey info address 1001 {name:zhangsan, age:14} {province:guangdong, city:guangzhou} 1002 {name:lisi, sex:male} {area:binjiang, street:juyelu}这个图完美解释了区别维度关系型MySQL非关系型HBase数据组织拆成多个表用ID关联全部塞进一行不关联用户和地址分两张表用user_id关联写在同一行直接嵌套查询方式JOIN两张表一次GET就拿到所有三、具体例子对比场景存储用户和订单关系型MySQL做法sql-- 用户表 CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 订单表关联用户 CREATE TABLE orders ( id INT PRIMARY KEY, user_id INT, -- 外键建立关系 price DECIMAL(10,2) ); -- 查询需要两张表关联 SELECT user.name, orders.price FROM user JOIN orders ON user.id orders.user_id;非关系型HBase做法bash# 一行存完不用关联 rowkey 用户ID 列簇 info: - name: 张三 列簇 orders: - 20250529_001: 99.00 - 20250529_002: 128.00 - 20250530_003: 59.00 # 查询一次GET全拿到 get user_orders, 用户ID四、为什么叫关系型4.1 历史来源1970年IBM研究员埃德加·科德发表论文《大型共享数据库的关系模型》提出用数学中的关系Relation来组织数据。数学中的关系就是表格关系 一张二维表 例如 用户关系表 ┌─────┬──────┐ │ id │ name │ ├─────┼──────┤ │ 1 │ 张三 │ │ 2 │ 李四 │ └─────┴──────┘ 订单关系表 ┌─────┬─────────┬────────┐ │ id │ user_id │ amount │ ├─────┼─────────┼────────┤ │ 101 │ 1 │ 99.00 │ │ 102 │ 1 │ 128.00 │ └─────┴─────────┴────────┘这两个关系通过 user_id 建立联系 → 关系型数据库4.2 通俗理解说法解释学术说法基于关系模型的数据库通俗说法表之间可以用外键牵线搭桥的数据库你的理解数据可以拆开存需要用的时候再拼起来五、关系型 vs 非关系型 核心区别维度关系型MySQL非关系型HBase/Redis/MongoDB数据组织多个表用外键关联单张表或者用嵌套/聚合表结构列固定改结构麻烦列动态随时可加查询方式SQL支持JOINAPI主要按Key查事务支持支持ACID事务有限支持HBase只有行级扩展方式垂直扩展加硬件水平扩展加机器数据量GB~TB级别TB~PB级别典型代表MySQL、Oracle、PostgreSQLHBase、Redis、MongoDB六、什么场景用哪种判断标准用关系型MySQL的场景 ✅# 1. 数据之间有复杂关系 例如学生-课程-成绩-老师需要多表关联查询 # 2. 需要事务保证 例如银行转账A扣钱B加钱必须一起成功 # 3. 数据结构稳定 例如用户表字段基本不变 # 4. 数据量中等 例如公司ERP系统百万级数据用非关系型HBase的场景 ✅# 1. 数据量巨大 例如用户行为日志每天几十亿条 # 2. 查询简单主要按主键 例如查某个用户的近期行为 # 3. 列经常变化 例如用户画像标签今天加一个喜欢运动明天加一个高消费 # 4. 不需要复杂JOIN 例如物联网设备数据、日志存储七、一句话总结关系型 数据拆开存用ID牵线省空间但查询麻烦 非关系型 数据堆一起存按Key查占空间但查询快类比搬家 关系型 打包拆开床板、螺丝分开装省地方但组装费劲 非关系型 整体搬直接抬走费地方但省事 没有谁更好看你要省空间还是省时间八、常见混淆点澄清错误认知正确理解关系型就是有SQL对但不是本质非关系型就是没SQLHBase确实没SQL但有类似工具Phoenix关系型不能存大数据MySQL也能存亿级但HBase更适合百亿级非关系型不需要设计恰恰相反HBase的rowkey设计是关键HBase确实没SQL是什么意思这句话需要澄清一下因为容易产生误解。一、HBase确实没SQL 是什么意思准确理解HBase本身不支持SQL 语法你不能像 MySQL 那样写SELECT * FROM user WHERE age 18HBase 有自己的 API 和 Shell 命令二、具体对比MySQL 有SQL你熟悉的写法sql-- 这些都是SQL SELECT * FROM user; SELECT * FROM user WHERE age 18; INSERT INTO user VALUES (1, 张三, 28); UPDATE user SET age 29 WHERE id 1; DELETE FROM user WHERE id 1;HBase 没SQL实际写法bash# 这不是SQL是HBase Shell命令 scan user scan user, {FILTER ValueFilter(,binary:18)} # 没有简单的 WHERE put user, 1, info:name, 张三 put user, 1, info:age, 28 delete user, 1, info:age三、但是HBase 可以有 SQL通过中间层这就是容易混淆的地方方式1Apache Phoenix最常用sql-- 用Phoenix可以在HBase上写SQL CREATE TABLE user ( id INTEGER PRIMARY KEY, name VARCHAR, age INTEGER ); SELECT * FROM user WHERE age 18; -- 这就是SQL INSERT INTO user VALUES (1, 张三, 28);Phoenix 怎么做到的把 SQL 翻译成 HBase 的 API 调用你的 SQL 变成底层的get、scan、put方式2Hive 映射sql-- 在Hive中创建映射表用Hive SQL查HBase CREATE EXTERNAL TABLE user_hbase ( id STRING, name STRING, age STRING ) STORED BY org.apache.hadoop.hive.hbase.HBaseStorageHandler; SELECT * FROM user_hbase WHERE age 18; -- Hive SQL四、所以正确的理解是说法是否正确说明HBase 原生不支持 SQL✅ 正确原生 Shell 和 API 都没有 SQLHBase 不能用 SQL❌ 错误可以通过 Phoenix 等工具用 SQLHBase 没 SQL 容易误解应该说 原生不支持 SQL五、为什么 HBase 原生不提供 SQL原因说明设计哲学不同HBase 追求简单、高效的单行操作SQL 开销大解析 SQL、优化查询计划、执行引擎都需要资源适用场景不同HBase 主要做 KV 查询不需要复杂 SQL保持轻量去掉 SQL 层让 HBase 更专注存储六、面试怎么回答面试官HBase 支持 SQL 吗HBase 原生不支持 SQL它有自己的一套 Shell 命令和 Java API。但是如果想用 SQL 查 HBase可以搭配Apache Phoenix使用Phoenix 会把 SQL 翻译成 HBase 的底层操作。不过生产环境中如果业务需要复杂 SQL 查询通常会选择用 Hive 或者 Spark SQL 来查 HBase。七、一句话总结textHBase 原生没SQL但可以穿上外衣支持SQLPhoenix/Hive 就像 - 中国人不会说英语HBase没SQL - 但可以配个翻译Phoenix跟老外交流用SQL查HBase