iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中常见的数据表设计误区有哪些
  • 768
分享到

MySQL中常见的数据表设计误区有哪些

2023-06-15 08:06:26 768人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关MySQL中常见的数据表设计误区有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。误区一:过多的数据列Mysql 存储引擎的 api 是按照行缓冲区方式从服务端和存储引擎复制

这篇文章将为大家详细讲解有关MySQL中常见的数据表设计误区有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

误区一:过多的数据列

Mysql 存储引擎的 api 是按照行缓冲区方式从服务端和存储引擎复制数据。服务端将缓冲区数据解码成数据列。然而,将行缓冲区的格式转换为数据行数据结构的列可能会代价很高。MyISAM 固定使用与服务端匹配的行格式,因此无需转换。然而,MyISAM 的可变行格式以及 InnoDB 的行格式总是需要进行转换。转换的代价依赖于列的数量。如果当数据表的列超过上百列的时候,会引起很高的 CPU 资源消耗——即便是使用到的列很少。曾经看过一篇文章,指的是一个多语言的解决方案,直接简单粗暴地将系统支持的语言用对应的列表示,例如:

CREATE TABLE t_multi_language_news (  id INT PRIMARY KEY,  title_cn VARCHAR(32),  title_en VARCHAR(32),  title_it VARCHAR(32),  ...  content_cn VARVHAR(256),  content_en VARCHAR(256),  conntent_it VARCHAR(256),);

这种方式随着系统支持的语言越多,数据表的列越多,最终导致性能严重下降。如果你设计一个数据表的列数量超过100时,就需要考虑你的设计是否合理了。 **应对方式:**首先是考虑业务本身的设计是否合理,如果确实一个实体需要很多字段来描述,那么可以拆分数据表,通过扩展信息表来做。举个例子,对于资讯类的数据表,因为内容一般占据的空间会比较大,但是在列表不会直接查看,就可以拆成资讯主表和资讯详情表,主表存储标题、时间、摘要、缩略图附件 id 等列表要查看的信息即可。而资讯详情可以存储资讯的内容、来源、原文链接等信息。

误区二:过多的联合查询

mysql 一次联合查询最多只能61张表。而有些设计主张不做冗余字段设计,这会导致复杂业务时需要连接多张表查询。即便是联合的表数量低于61个,也会引起性能的下降,而且整个 sql 语句的维护将变得十分困难。作为一个设计的首要原则,就是如果想追求速度的话,一次查询不要跨太多的数据表做联合查询,尤其面临高并发场景的时候。 **应对方式:**首先,对于确定不会改变的字段,可以考虑冗余字段的方式减少联合查询。例如,一家企业的所属省份信息,就可以把省份代码、省份名称冗余了,而无需再通过省份代码去查询省份名称。其次,确实需要查其他表的情况下,可以考虑使用分步查询的方法,通过应用程序完成数据的组装,这种效率在数据表很多的时候会更高效,而且代码也更好维护。 误区三:万能的枚举 例如下面这种表设计:

CREATE TABLE t_countries (  ...  country ENUM('', '1', '2', ..., '45'),  ...);

这种方式本来可以通过一个以整数为 key的字典的查找表实现。如果是业务上增加了一个枚举,意味着整个表都需要使用 ALTER TABLE更新。而如果是使用应用代码的查找表,只需要增加新的键值对就好了。 **应对方式:**如果枚举确定不会变动(例如性别),那么没问题。如果枚举可能会增加,那么尽可能地通过应用程序来实现。

误区三:滥用 SET替代 ENUM

枚举ENUM 类型是数据表列的值只能是值集合中的一个,而 SET 类型是该列可以有一个或多个值。如果确定一个列只会有一个值,那么就应该优先使用枚举,而不是集合。例如下面的例子就是典型的滥用:

CREATE TABLE t_payment_way (  ...  is_default SET('Y', 'N') NOT NULL DEFAULT 'N',  ...);

很显然,is_default 要么是 Y,要么是 N,因此这里应该使用 ENUM。 **应对方式:**从业务层面考虑列的值是不是可能有多个,如果只有1个可选值那么就用 枚举ENUM。

误区四:生硬地避免NULL

很多文章都讨论过尽可能地避免使用 NULL,对于大部分场景这是一个好的设计,我们可以通过0,空字符串,约定的值等来表示空值。然而,不要因为这个而生硬套用,如果是这个值本身就是一个无意义的值的时候,那么使用 NULL 可能更合适。例如,如果要是有-1代表一个无意义的整数,可能会导致代码很复杂,甚至可能引起 bug。例如下面的例子:

CREATE TABLE t_person (  birthday DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',  ...,);

将一个 DATETIME 类型的默认值设置为全部是0会很奇怪,假设我们要统计人员的年龄平均值的时候,会引起莫名其妙的问题,而这种场景使用 NULL 就不会纳入到统计中来。可以通过设置 MySQL 的 SQL_MODE 参数禁止使用无意义的日期,避免出现这种情况。 **应对方式:**设计表的时候可以尽量使用 NOT NULL 避免空值,但是不要过于生硬,对于有些字段使用默认值无法表名意义或与实际不符时,也是可以选择使用 NULL 列的。只是,需要注意索引列不要使用NULL。而实际上,绝大部分索引列不太可能会是 NULL。

误区五:使用整数替换时间戳

之前有讲到过时间格式如何选择的问题,实际上有些开发者会使用整数来存储时间戳,他们的理由是这样效率更高。从某种意义上来说,可能会提高一点效率,但是帮助不大,因为在 MySQL 内部DATETIME 和 TIMESTAMP 本身就是用整数存储的。而如果使用整数存储时间的话,意味着应用程序中需要做时间转换,或者是 SQL 语句要对指定的字段进行时间转换,带来的收益可能得不偿失。 **应对方式:**尽可能地使用 DATETIME 存储时间,如果需要存储秒级精度一下的时间,那么可以考虑使用 BIGINT 来存储。

误区六:忘记字段的最大存储范围

在实际中设计表的时候会忘记数据类型的存储范围,比如使用 TINYINT(2)并不是只能存储两位整数,实际TINYINT(2) 可以存储的范围是-128-127。 存储超过255的整数。这种错误在使用整数类型的时候很容易出现问题,在插入整数的时候,MySQL 不会检查实际的整数位数,而是按对应存储字节数的范围存入,这种情况假设不注意会存入无意义的值。例如下面的 INSERT 操作会成功,而我们可能误以为 TINYINT(2)只能存储2位整数:

CREATE TABLE t_int_test (    id INT PRIMARY KEY,    number TINYINT(2));INSERT INTO t_int_test (id, number) VALUES (3,123);

应对方式:在应用程序中做数据校验。

关于“MySQL中常见的数据表设计误区有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中常见的数据表设计误区有哪些

本文链接: https://www.lsjlt.com/news/279342.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中常见的数据表设计误区有哪些
    这篇文章将为大家详细讲解有关MySQL中常见的数据表设计误区有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。误区一:过多的数据列MySQL 存储引擎的 API 是按照行缓冲区方式从服务端和存储引擎复制...
    99+
    2023-06-15
  • 数据库设计的误区有哪些
    这篇文章主要介绍“数据库设计的误区有哪些”,在日常操作中,相信很多人在数据库设计的误区有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库设计的误区有哪些”的疑惑有所帮...
    99+
    2024-04-02
  • 网页设计中常见的错误有哪些
    本篇内容主要讲解“网页设计中常见的错误有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“网页设计中常见的错误有哪些”吧!  网页结构上的瑕疵   很多设计师把握不好承载信息的空间与留白之间的平...
    99+
    2023-06-08
  • SEO常见误区有哪些
    小编给大家分享一下SEO常见误区有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  一、内容一定要原创  关于内容原创,不能说他不好,但也不能一味的刻意追求,...
    99+
    2023-06-10
  • Redis数据库常见的键值设计有哪些
    这篇文章将为大家详细讲解有关Redis数据库常见的键值设计有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  用户登录系统  记录用户登录信息的一个系统,我们简化业务...
    99+
    2024-04-02
  • python学习中常见的误区有哪些
    这篇文章主要介绍“python学习中常见的误区有哪些”,在日常操作中,相信很多人在python学习中常见的误区有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python学习中常见的误区有哪些”的疑惑有所...
    99+
    2023-06-27
  • MySQL中有哪些常见SQL错误
    本篇文章为大家展示了 MySQL中有哪些常见SQL错误,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。常见SQL错误用法1. LIMIT 语句分页查询是最常用的场景之...
    99+
    2024-04-02
  • MySQL常见错误有哪些
    小编给大家分享一下MySQL常见错误有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Can’t connect to M...
    99+
    2024-04-02
  • Golang 函数调试的常见误区有哪些?
    go 函数调试的常见误区包括:忽略日志记录,导致缺乏有价值的错误信息。滥用断言,可能导致程序意外退出。使用全局变量进行调试,可能引起并发问题。正确地应用日志记录、断言和局部变量可以有效避...
    99+
    2024-04-17
    调试 golang 并发访问 同步机制
  • mysql中常见的数据类型有哪些?
    mysql 提供多种数据类型来存储不同类型的数据,包括整数类型、浮点数类型、定点类型、字符类型、时间和日期类型以及其他类型。这些数据类型具有不同的特性和用途,用于满足不同数据的存储需求。...
    99+
    2024-04-26
    mysql
  • sql设计表结构的常见问题有哪些
    这篇文章主要介绍sql设计表结构的常见问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.sql改写遇到表字段经常要增加的业务怎么设计表结构?2.业务问题是什么?简单说就是有...
    99+
    2024-04-02
  • 有哪些常见的设计模式
    这篇文章主要讲解了“有哪些常见的设计模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些常见的设计模式”吧!一、建造者模式建造者模式(Builder P...
    99+
    2024-04-02
  • Hive中的数据仓库设计模式有哪些常见模式
    在Hive中,常见的数据仓库设计模式包括以下几种: 星型模式(Star Schema):星型模式是数据仓库中最常见的模式之一,通...
    99+
    2024-04-02
  • Mysql中有哪些常见的函数
    这篇文章将为大家详细讲解有关Mysql中有哪些常见的函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、常见函数分类1.1单行函数:字符函数字符控制函数(CONCAT、SUBSTR、LEN...
    99+
    2023-06-14
  • 常见的MySQL高可用设计方案有哪些
    这篇文章主要讲解了“常见的MySQL高可用设计方案有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常见的MySQL高可用设计方案有哪些”吧!MySQL高可用设计方案,如果单MySQL的优...
    99+
    2023-06-27
  • Java常见的误区与细节有哪些
    这篇文章主要讲解了“Java常见的误区与细节有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java常见的误区与细节有哪些”吧!在Java中,没有goto语句。因为大量使用goto语句会...
    99+
    2023-06-17
  • MySQL数据库有哪些常用架构设计
    本篇文章给大家分享的是有关MySQL数据库有哪些常用架构设计,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、MySQL引擎MySQL提供了两...
    99+
    2024-04-02
  • MySQL常见错误代码有哪些
    本篇内容介绍了“MySQL常见错误代码有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先给大家看几个实...
    99+
    2024-04-02
  • JavaScript中常见的错误有哪些
    这篇文章主要讲解了“JavaScript中常见的错误有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中常见的错误有哪些”吧!Java...
    99+
    2024-04-02
  • SQL中有哪些常见的错误
    这篇文章给大家介绍SQL中有哪些常见的错误,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 1、LIMIT 语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作