关于 web 的 MySQL 设计

标签 mysql database database-design

我正在解决类里面的一个问题,即设计一个 web 的 mySQL 表示,该 Web 存储与一个人相关的事件列表。因此,对于这个/多个表,它将有 2 列,其中一列是人名,另一列是事件。然而,一个人通常会有 30 到 1000 个事件,因此我们计划为 6000 名学生的整个本科类(class)制作的这张表将有数百万个条目。有没有更好的方法将其存储在 mySQL 中,占用更少的空间,但仍然能够检索单个事件和参加它的人员列表,就像它是一张表一样容易两列?

最佳答案

是的,有一种称为多对多的技术,它基本上将您的一个表分成三个,当您考虑确实恰好有三个实体被建模时(作为一个良好的完整性检查)

  1. 个人
  2. 事件
  3. 一个人与一个事件的关联

您将其建模为三个表,前两个基本上各有两列:一个具有唯一索引(称为“主键”),第二个是语义名称(人名、事件名称)。请注意,您还可以向其中添加任意数量的列,而只有一个因素会增加存储空间(很可能您的第一步是向事件表中添加一个日期列)。

第三个表很有趣,它只包含 2 列,每一列都是数字,这两列都是对其他表的引用(每行只是:(person_id,event_id))。我们将这些称为“外键”。

这个结构意味着几件事:

  1. 无论某人参加多少次事件,该人都只代表一次。
  2. 与事件相同,无论有多少人参加
  3. 考勤是一个“一流”的实体,可以成长为包含它自己的属性(即“角色”)

这种结构称为多对多,因为每个人可能会参加很多事件,而每个事件可能有很多人参加。

该设计的典型特征是没有重复任何领域知识,仅在必要时重复“ key ”以对真实领域进​​行建模。 (即在您的第一个示例中,考虑名称更改将需要未知数量的更新,并可能导致数据异常,避免这种情况是 database normalization 的主要关注点。

关于关于 web 的 MySQL 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224856/

相关文章:

php - 如何选择默认值下拉菜单

mysql - 获取特定行组中的最大值

database-design - 我如何为一个应用程序设计数据库来处理多个国家的特殊需求

mysql - 带有便利设施的建筑物的 SQL 结构

iphone - 用于计算关键字的最有效的数据库模式

mysql - 类型错误 : Cannot set property 'decoder' of undefined

mysql - 如何使用 node.js 在 mySQL 中进行批量插入

mysql - 巨大的 mysqldump 导入

c# - 在 Entity Framework Core 中使用 Update-Database 添加新列

sql - 加快缓慢的SQL查询