mysql数据库和表的关系是怎样

我记得有一次,我负责公司一小部分的数据库项目。
那天我坐在电脑前,需要大量的文档,试图解释最适合的数据库结构。
我突然想到一个简单的场景:就像我们的办公桌一样,文件总是放在文件夹里,文件夹又放在办公桌里。

计划是创建一个名为“某信息”的数据库作为抽屉,然后在该抽屉中创建几张表,例如“某表基本信息”、“某表出勤”和“员工不良工资”。
每个表就像文件夹中的一个文件,用于存储不同类型的数据。

记得那天我花了差不多两个小时写了一系列创建数据库表和表的SQL语句。
当我完成了上次预约的课程并成功创建了一张名为“员工基本信息表”的表时,我突然有一种成就感。
这不仅仅是因为代码执行成功,更是因为我了解了容器之间的关系以及数据库和表之间的内容。

等等,我突然想到,如果以后预计规模扩大,我们需要处理更多的数据,我们就需要在这个文件夹中添加更多的文件夹(即文件),同时我们还需要重新思考整个桌面文件的布局(即数据库结构)。
这就是我意识到正确组织和设计数据库和表之间的关系以保持数据高效和安全的重要性。

MySQL数据库三大范式的解析mysql三大范式是什么

上次帮朋友调试数据库的时候,他的表中学生注册的班级居然是在一个字段中用逗号分隔的。
一开始我以为是个小函数,后来查资料发现它违反了第一范式。

例如,有一个学生注册表,将所有课程直接放入一个字段中,如下所示: sql 学生证|名称 |课程 1 |小明|数学、英语、物理 2 |小红|语文、数学、英语 这显然是不可能的。
如果你想找到只学数学专业的学生,​​你将找不到他们。
所以必须要分,每个课程都有自己的线路: sql 学生证|名称 |课程 1 |小明|数学 1 |小明|英语 1 |小明|物理学 2 |小红|中文 2 |小红|数学 2 |小红|英语 这称为第一范式,每个字段都是最小的不可分割的数据单元。

后来他问我第二范式。
我举了一个例子,比如订单表。
一份订单购买多件商品。
如果将所有产品直接分组到一张表中,则检查特定产品的所有订单将非常繁琐。
例如: sql 订单编号 |产品编号 |产品数量 |产品名称 |产品价格 1 | 1 001 | 1 001 2 |手机 | 1 5 00 1 | 1 002 | 1 002 1 |笔记本| 5 00 2 | 1 001 | 1 001 1 |手机 | 1 5 00 这不符合第二范式,因为“产品名称”和“产品价格”并不直接依赖于“订单ID”,而应该分为产品表和订单详细信息表。

例如,在第三范式中,我认为公司有一张表,存储员工的部门和工资。
事实证明,“薪资”字段与“员工 ID”没有直接联系。
而是需要通过“部门ID”查看部门的薪资标准,然后进行计算。
这非常令人困惑。
例如: sql 员工证|名称 |部门编号|薪资 1 |小明| 1 01 | 1 01 ? 2 |小红| 1 02 | 1 02 ? “薪资”字段实际上是基于“部门 ID”而不是“员工 ID”。
因此,首先需要检查“部门ID”对应的默认工资,这会导致数据冗余和更新异常。

等一下,我突然想到了别的事情,比如说医院的病人名单。
一名患者接受了多个科室的检查。
如果将所有科室直接插入到一个字段中,则很难检查特定科室接诊了多少患者。
必须分为: sql 患者 ID |名称 |部门编号|访问日期 1 |小王| 3 01 | 3 01 2 02 3 年 1 0 月 2 6 日 1 |小王| 3 02 | 3 02 2 02 3 年 1 0 月 2 6 日 2 |小李| 3 01 | 3 01 2 02 3 年 1 0 月 2 7 日 没错。

但是,过度标准化有时会产生问题。
上次优化表结构,分表N次后,发现查询需要几十次JOIN,而且比不分表跑得慢。
因此,我们现在一般会转向第二个或第三个范式,具体取决于业务场景。

等一下,还有一件事。
例如,用户可以在电子商务购物车表中添加许多产品。
如果每个产品都有自己的行,则必须删除数百条数据才能清空购物车,这可能会使数据库过载。
所以有时你必须牺牲一个范例并使用 Product ID List 字段将其放入JSON 格式保存。

现在想来,范式其实只是一个参考,而不是硬性规定。
就像做菜一样,要讲究色、味、味,但这并不意味着要严格遵循老方法。
有时候创新的菜品更美味。
数据库设计也是如此,具体情况而定。