首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 纵表和横表

基础概念

纵表(垂直表)横表(水平表)是数据库设计中两种不同的表结构方式。

  • 纵表:将一个实体的所有属性都放在一张表中,每个属性对应一个字段。这种方式的优点是结构清晰,易于理解和维护,但缺点是当实体属性非常多时,表结构会变得非常庞大,查询和维护效率可能会降低。
  • 横表:将一个实体的多个属性拆分成多张表,每张表存储一部分属性。这种方式的优点是可以有效地减小单张表的规模,提高查询和维护效率,但缺点是结构相对复杂,需要通过关联查询来获取完整的数据。

相关优势

  • 纵表的优势
    • 结构简单,易于理解和维护。
    • 查询时不需要进行多表关联,性能相对较好。
  • 横表的优势
    • 有效地减小单张表的规模,提高查询和维护效率。
    • 适合存储属性较多且不常用的实体,可以节省存储空间。

类型

  • 纵表:所有属性都放在一张表中。
  • 横表:将属性拆分成多张表,通过关联查询获取完整数据。

应用场景

  • 纵表:适用于实体属性较少且常用的情况,例如用户基本信息表。
  • 横表:适用于实体属性较多且不常用的情况,例如电商平台的商品属性表,可以将商品的基本信息和扩展属性分开存储。

遇到的问题及解决方法

问题1:纵表表结构庞大,查询效率低下

原因:当实体属性非常多时,纵表会变得非常庞大,导致查询和维护效率降低。

解决方法

  1. 拆分成横表:将实体属性拆分成多张表,通过关联查询获取完整数据。
  2. 索引优化:为常用的查询字段添加索引,提高查询效率。
  3. 分库分表:将数据分片存储在多个数据库或表中,提高查询和维护效率。

问题2:横表关联查询复杂,性能瓶颈

原因:横表需要通过多表关联查询来获取完整数据,当关联表较多时,查询性能可能会成为瓶颈。

解决方法

  1. 缓存优化:使用缓存技术(如Redis)缓存常用的查询结果,减少数据库查询次数。
  2. 预加载:在业务逻辑中提前加载关联数据,减少实时查询的次数。
  3. 优化SQL语句:编写高效的SQL语句,减少不必要的关联查询。

示例代码

假设我们有一个电商平台的商品表,实体属性较多,我们可以将其拆分成两张表:商品基本信息表和商品扩展属性表。

商品基本信息表(product_info)

| 字段名 | 类型 | 描述 | |--------------|---------|----------| | product_id | INT | 商品ID | | product_name | VARCHAR | 商品名称 | | category | VARCHAR | 商品分类 |

商品扩展属性表(product_attribute)

| 字段名 | 类型 | 描述 | |--------------|---------|----------------| | attribute_id | INT | 属性ID | | product_id | INT | 商品ID | | attribute_name| VARCHAR | 属性名称 | | attribute_value| VARCHAR | 属性值 |

查询商品完整信息的SQL语句

代码语言:txt
复制
SELECT 
    pi.product_id,
    pi.product_name,
    pi.category,
    pa.attribute_name,
    pa.attribute_value
FROM 
    product_info pi
LEFT JOIN 
    product_attribute pa ON pi.product_id = pa.product_id
WHERE 
    pi.product_id = 1;

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MYSQL 清空截断

    清空截断 清空:delete from users; 清空只是清空中的逻辑数据,但是物理数据不清除,如主键值、索引等不被清除,还是原来的值。...截断:truncate table users; 截断可以用于删除中 的所有数据。截断命令还会回收所有索引的分配页。...截断的执行速度与不带where子句的delete(删除)命令相同,甚至比它还要快。...delete(删除)一次删除一行数据,并且将每一行被删除的数据都作为一个事务记录日志;而truncate (截断)则回收整个数据页,只记录很少的日志项。...delete(删除)truncate(截断)都会回收被数据占用的空间,以及相关的索引。只有的 拥有者可以截断。 另外,truncate之后,如果有自动主键的话,会恢复成默认值。

    5.2K10

    列转行-多列转多行(变竖

    81 | 94 | 88 | +-------------+--------+---------+---------+ 二、函数介绍 sum case 三、多列转多行(变竖...) 原始数据为一张,分别有三列成绩列,想要转成竖,需要转换成三列分别为 学生id、学科、成绩,转换完成之后学生id将不再是主键。...003 | 英语 | 88 | +-------------+----------+--------+ 2.数据拼接后炸裂开 2.1拼接数据 使用concat对科目科目对应的分数进行拼接...--+--------------------+ 2.2 lateral view explode 将成绩列转行 使用lateral view explode 将成绩列转行,然后使用split将科目分数分开...subject = '英语' then score end) as yingyu from t_student_score group by student_id 本文同步在微信公众号”数据仓库技术“个人博客

    10310

    MySQL InnoDB 共享空间独立空间

    导读:深入学习MySQL的时候总是习惯性的Oracle数据库进行比较。在学习MySQL InnoDB的存储结构的时候也免不了跟Oracle进行比较。...Oracle的数据存储有空间、段、区、块、数据文件;MySQL InnoDB的存储管理也类似,但是MySQL增加了一个共享空间独立空间的概念。...三、共享空间优缺点 既然Innodb有共享空间独立空间两种类型,那么这两种空间存在肯定都有时候自己的应用的场景,存在即合理。...以下是摘自mysql官方的一些介绍: 共享空间的优点 空间可以分成多个文件存放到各个磁盘,所以也就可以分成多个文件存放在磁盘上,的大小不受磁盘大小的限制(很多文档描述有点问题)。...共享空间分配后不能回缩:当出现临时建索引或是创建一个临时的操作空间扩大后,就是删除相关的也没办法回缩那部分空间了(可以理解为oracle的空间10G,但是才使用10M,但是操作系统显示mysql

    4K30

    mysql分区_MySQL分区分

    mysql中有一种机制是锁定行锁定,是为了保证数据的完整性。锁定表示你们都不能对这张进行操作,必须等我对表操作完才行。...Mysql分为垂直切分水平切分,具体区别如下: 垂直切分是指数据表列的拆分,把一张列比较多的拆分为多张 通常我们按以下原则进行垂直拆分: 把不常用的字段单独放在一张; 把text,blob(...merge分,分为主表子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。 我们可以通过主表插入查询数据,如果清楚分规律,也可以直接操作子表。...#创建两个分结构必须上面完整的结构一致 mysql> create table tb_member1 like member; mysql> create table tb_member2 like...举个简单例子:一个包含了大textBLOB列的,这些textBLOB列又不经常被访问,这时候就要把这些不经常使用的textBLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

    10.9K20

    清空与删除mysql

    Mysql清空(truncate)与删除中数据(delete)的区别 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经被插入了几万条垃圾留言,如果一条条删除那可真是累人的活。...遂考虑直接进入mysql直接清空或者删除中数据。 本文记录一下这2种操作模式的区别,目标对象是wp_comments,里面的所有留言均是垃圾留言,均可删除。...然后便有了以下2种方式(进入mysql操作界面后): truncate table wp_comments; delete * from wp_comments; 其中truncate操作中的table...这两者都是将wp_comments中数据清空,不过也是有区别的,如下: truncate是整体删除(速度较快), delete是逐条删除(速度较慢)。...如果只需删除中的部分记录,只能使用DELETE语句配合where条件。 DELETE FROM wp_comments WHERE……

    8.1K20

    MySQL 类型存储引擎

    # MySQL 类型存储引擎 mysql 类型存储引擎 基本介绍 主要的存储引擎/类型特点 细节说明 三种存储引擎使用案例 如何选择的存储引擎 # mysql 类型存储引擎 # 基本介绍...InnoDB存储引擎提供了具有提交、回滚崩溃恢复能力的事务安全。但是比起MylSAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据索引。...但是一旦MySQL服务关闭,中的数据就会丢失掉,的结构还在。...CREATE TABLE t28( id INT, `name` VARCHAR(32)) ENGINE MYISAM -- 1.添加速度快 2.不支持外键事务 3.支持级锁 START...INTO t28 VALUES(1,'jack'); SELECT *FROM t28 ROLLBACK TO t1 -- 没有回滚成功 -- memory 存储引擎 -- 1.数据存储在内存中[关闭mysql

    1.7K30

    mysql的水平分垂直分的区别

    但是我们只关心分数,并不想查询题目回答。这就可以使用垂直分割。我们可以把题目单独放到一张中,通过id与tt建立一对一的关系,同样将回答单独放到一张中。...4,合理的硬件资源操作系统 如果机器的内存超过4G,那么应当采用64位操作系统64位MySQL。...案例: 简单购物系统暂设涉及如下表: 1.产品(数据量10w,稳定) 2.订单(数据量200w,且有增长趋势) 3.用户 (数据量100w,且有增长趋势) 以mysql为例讲述下水平拆分垂直拆分...,mysql能容忍的数量级在百万静态数据可以到千万 垂直拆分: 解决问题: 之间的io竞争 不解决问题: 单中数据量增长出现的压力 方案: 把产品用户放到一个server上 订单表单独放到一个...server上 水平拆分: 解决问题: 单中数据量增长出现的压力 不解决问题: 之间的io争夺 方案: 用户通过性别拆分为男用户女用户 订单通过已完成完成中拆分为已完成订单未完成订单

    1.1K20

    修改名列名mysql_怎么修改mysql列名?

    mysql中,可以通过“ALTER TABLE 旧表名 RENAME 新名;”语句来修改名,通过“ALTER TABLE 名 CHANGE 旧字段名/列名 新字段名/列名 新数据类型;”语句来修改列名...修改mysqlMySQL 通过 ALTER TABLE 语句来实现名的修改,语法规则如下:ALTER TABLE RENAME [TO] ; 其中,TO 为可选参数,使用与否均不影响结果。...例 1 使用 ALTER TABLE 将数据 student 改名为 tb_students_info,SQL 语句运行结果如下所示。...,因此修改名称后的修改名称前的的结构是相同的。...用户可以使用 DESC 命令查看修改后的结构, 修改mysql的列名(字段名) MySQL 数据是由行列构成的,通常把的“列”称为字段(Field),把的“行”称为记录(Record)。

    11.5K20

    java mysql 分区_mysql分区

    对用户来说,分区是一个独立的逻辑,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层的句柄对象的封装。 mysql在创建时使用PARTITION BY子句定义每个分区存放的数据。...5.如果需要,还可以备份恢复独立的分区,这在非常大的数据集的场景下效果非常好。 分区本身也有一些限制,下面是其中比较重要的几点: 1.一个最多只能有1024个分区。...2.在mysql5.1中,分区表达式必须是整数,或者是返回整数的表达式。在mysql5.5中,某些场景中可以直接使用列进行分区。...3.如果分区字段中有主键或者唯一索引的列,那么所有主键列唯一索引列都必须包含进来。 4.分区中无法使用外键约束。...update操作 当更新一条记录时,分区层先打开并锁住所有的底层mysql先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据在哪个分区,最后对底层进行写入操作,并对原数据所在的底层进行删除操作

    7.8K10

    MySQL之间的关系

    之间的关系 1 foreign key 2 则1的多条记录对应2的一条记录,即多对一 利用foreign key的原理我们可以制作两张的多对多,一对一关系 多对多: 1的多条记录可以对应...2.在创建关联,关联字段一定保证是要有重复的。 示例: 这是一个书出版社的一个例子,书要关联出版社(多个书可以是一个出版社,一个出版社也可以有好多书)。 谁关联谁就是谁要按照谁的标准。...); insert into admin(user_id,password) values(4,'sds156'),(2,'531561'),(6,'f3swe'); 运行结果 图片 示例二: 学生客户...(我们可以再创建一张,用来存bookauthor两张的关系) 要把book_idauthor_id设置成联合唯一 联合唯一:unique(book_id,author_id)  联合主键:alter...图片 创建 ========书作者,另外在建一张来存书作者的关系 #被关联的 create table book1( id int primary key auto_increment, name

    3.5K10

    MySQL分区

    子分区的结构是:范围分区>>>HASH分区 或 范围分区>>>列表分区要注意的是:列表分区不支持多列,但是范围分区hash分区支持多列。 代码示例: ?...Mysql的一些优化方式: 根据情况更换适当的数据库引擎,一般最好是使用MyISAM引擎,因为是在内存中所以查询速度要比其他引擎快得多。 一张必须要有主键。...数据量很大的时候就需要建立分区,如果数据量非常的大就需要在分区中建立子分区。...连接查询: 连接查询分为内连接外连接,外连接又分为右外连接、左外连接全外连接,不过在mysql里不支持全外连接的写法。...内连接:就是把两张的记录进行连接,因为它们有关系的映射,所以连接在一起方便客户的查看。能够使用内连接将两张有关系映射的的数据符合条件的显示出来,不符合条件的就不显示。

    7.1K20
    领券