数据库字段设计

这篇具有很好参考价值的文章主要介绍了数据库字段设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.为什么要设置主键?
答:在一张表中,可以确定一条唯一记录的属性集(这个属性集中的元素可能有一个,两个,三个甚至更多)称为超键;如果属性集中只有一个元素,则通过这个属性集就可以确认一条唯一的记录,这样的属性集称为候选键;从候选键中选择某一个属性集即可作为主键。由上述内容可知超键、候选键、主键集合包含关系为:超键>候选键>主键。
但是一张表中可以有主键、也可以没有;但如果是表结构比较复杂、数据量庞大的表,则建议设置主键,否则会眼中影响CRUD操作的效率,因为没有安全的方法保证值涉及到相关的行。

2.聚集索引是怎么确定的?
答:如果设置了主键,则InnoDB会选择主键作为聚集索引,如果不设主键,则会选择第一个NOT NULL的唯一索引作为聚集索引,如果以上两个条件都不满足,则会选择长度为6个字节的ROWID作为聚集索引。

3.键是用自增还是UUID?
答:首先,InnoDB使用聚集索引,所有的数据存储在主索引的叶子节点上,这就要求同一叶子节点(大小为一个磁盘页或者内存页)内的各条记录需要按照主键顺序来存放,因此每当有一条数据添加进数据库时,MySQL需要根据其主键大小为其查找适当的位置来存放,如果页面达到装载因子(15/16),则会开辟一个新的节点来存放。
因此,如果使用自增长主键,那么每次插入新纪录时,则只需要把这条记录添加到当前索引节点的后续位置;但如果使用UUID作为主键,则每次插入新的记录时,首先需要根据主键的大小在主索引的所有叶子节点内查找合适的位置,然后移动查找到的位置之后的记录,这就造成了移动记录的开销和空间碎片,后续需要通过optimize table来优化。
所以在使用InnoDB存储引擎时,如果没有特别的需要,建议使用与业务无关的自增字段作为主键。

4.主键为什么不推荐有业务含义?
答:归根结底,具有业务含义的主键可能发生改变,如果发生改变,则需要根据主键的值在主索引的叶子节点内重新排序,这就可能造成行数据的大规模移动,带来很大的时间开销,同时,这种变化会带来页分裂,但是在页分裂的时候,InnoDB会在B+索引树上加锁,从而导致锁抢用的现象。
页分裂:页分裂发生在insert(主键不递增)或update操作下,通常来说,B+索引树的叶子节点的大小为一个内存页或者磁盘页,当进行上述操作时,会造成当前页的数据大小超出页大小,这就会造成需要创建一页新页来存放数据,而这个新页则需要根据页顺序进行排列,这就造成:假如原先的页顺序是10-11-12,对11页进行insert或update操作,数据大小超出页大小,则需要新增一页来保存,按理来说,新增的一页页号应该为12,但是12页已经存在,假设14页不存在,创建新页14,调整链表的前后指针,形成10-11-14-12的页顺序,这样在物理存储上页是混乱的,并且这个页很大概率在不同的区。要调整这种混乱的页顺序,可以使用optimize table来理顺表,另一种就是页合并。
页合并:当我们在数据库中删除一行记录时,并不会立即删除,而是现在要删除的行设置一个标记位,代表该行记录可被覆盖,当页中被标记的记录数量达到页大小的50%,则该页就会在其相邻页寻找是否可以将两页合并以优化空间,同时对记录更新也可能出现这种情况。

5.货币字段存储用什么类型?
答:货币类型推荐使用decimal来存储,因为使用double和float存储,当数值比较大的时候,可能存在微小的误差。

6.时间字段用什么类型?
答:timestamp(占4个字节,该字段能存储的范围是:1970-01-01 08:00:01至2038-01-19 11:14:07,但是其优点是:该字段保存的时间带有时区,一旦系统的时区发生改变,该字段的值就会自动更新,适合用来做跨时区的应用)
datetime(占8个字节,该字段的存储范围是:1000-01-01 00:00:00至9999-12-31 23:59:59,其缺点是时间是绝对的,不会随着系统时区更新)
bigInt(占8个字节,存放时间戳,缺点就是时间展示不直观)

7.为什么不在数据库中存储文件,视频,图片等?
答:数据库中可以使用text,blob来存储大文件,但我们通常来说都把文件、视频存在在文件系统中,而在数据库中存放存储路径,其主要原因是:
(1)MySQL内存临时表不支持text、blob等类型,处理时会非常缓慢。
(2)数据库大,内存占用比较高,维护麻烦。
(3)binlog太大,如果是主从同步,会导致主从同步效率问题。

8.如果一张表中如大字段,且该字段不会频繁更新,以读为主,是拆成子表还是存放在一起?
答:如果拆成子表,则会带来连表查询消耗,如果存放在一起,则会带来查询性能,所以视情况而定,但如果数据量特别大,建议拆成子表。文章来源地址https://www.toymoban.com/news/detail-791550.html

到了这里,关于数据库字段设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Oracle数据库在指定字段后新增字段

    记录一下数据库中为表增加字段,且在指定字段后新增; mysql数据库的话比较简单通过一下sql语句即可实现: 而Oracle数据库不支持上述语法,添加字段只能显示到最后一位,所以如果非要添加字段到指定字段后的话可以通过新建数据表并修改表明实现,如下面语句所示:

    2024年02月15日
    浏览(50)
  • django添加数据库字段进行数据迁移

    1.修改view.py里面的变量 2.在model.py新增字段 3.打开terminal并将环境切到项目所在环境,切换方式为 4.执行命令

    2024年02月09日
    浏览(58)
  • 关于数据库json 字段的查询

    1、查询json字符串中是否包含某个节点 2、查询json字符串中某个节点等于或者不等于某个值 需要注意的点json串和json数组匹配方式不同 json数组匹配  $[*].name  或者 $[0].name json串 $.name 这里发现一个总结的很好的博主,推荐一下 mysql中json_extract的使用方法_-王尚可-的博客-CSDN博

    2024年02月16日
    浏览(66)
  • Mysql中的对数据库字段的数据进行加密

    注意点:此处只对name字段进行了字段类型的修改。 ENCODE(\\\'123\\\',\\\'123\\\'): 第一个123:表示插入数据库中的数据(即将要被转换的数据) 第二个123:表示转换秘钥,可以任意起名。在解密的时候会需要用到。 结果: 注意点1 :此处DECODE的两个参数分别为 需要解密的内容(数据库中

    2024年02月09日
    浏览(65)
  • MyBatis Plus 数据库字段加密处理

    当项目开发到一半,可能突然客户会要求对数据库里面比如手机号、身份证号的字段进行加密; 在保证开发最快、影响范围最小的情况下,我们需要选择一种介于数据库和代码之间的工具来帮我们实现自动加解密; 这里我们选用AES对称加密算法,因为它是可逆算法。 AES加密

    2024年02月07日
    浏览(61)
  • mysql 查询数据库所有表,表字段

    工作中,编写xmlsql时需要查询全部字段,可以利用sql快速组装所有的列 1.查询所有的表名 2.查询某个表的所有字段 3.组装表的所有列

    2024年02月12日
    浏览(49)
  • SQLServer数据库给某个字段添加自增

    1、启动Microsoft SQL Server Management Studio 18工具 Navicat好像不能设置字段的自增…,所以用了Management Studio 18 2、工具 选项 设计器 3、修改这个字段为自增,并保存! 4、测试,发现此字段自增成功!

    2024年02月15日
    浏览(69)
  • 【如何获取数据库表的字段并拼接】

    在写sql语句时,我要获取到该表的大部门字段来做处理,一个个粘贴复制太费事了,所以我决定执行sql语句把表中字段查询出来 其中 test 是表名, school 是数据库名字,这样能把该数据库中某表的所有字段查询出来 因为我要做查询,需要逗号拼接,所以,对sql语句进行了修改

    2024年02月10日
    浏览(51)
  • PostgreSQL数据库实现表字段的自增

    在使用MySQL的时候,创建表结构时可以通过 AUTO_INCREMENT 来指定主键是否自增。在PostgreSQL数据库中,使用序列来实现字段的自增。 PostgreSQL序列是一种特殊的用于生产整数序列数据库对象。序列通常用于主键列,与mysql的AUTO_INCREMENT 概念类似。 PostgreSQL 提供三种序列伪类

    2024年02月04日
    浏览(81)
  • Android Studio 使用SQLite数据库来创建数据库+创建数据库表+更新表再次往表添加字段

    目录 一.前言 二.SQLite数据库介绍 1.什么是SQLite数据库 2.特点 3.SQLite 操作API 4.SQLite数据类型 三.SQlite数据库的使用 1.创建类继承SQLiteOPenHelper 2.创建数据库 3.创建数据库表 4.更新表添加字段 完整代码 扩展 总结 我们在使用Android进行开发的时候不可避免的要使用到数据,那么就需

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包