首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于web的MySQL设计

关于web的MySQL设计
EN

Stack Overflow用户
提问于 2012-09-01 04:20:02
回答 3查看 53关注 0票数 0

我正在处理一个问题,在课堂上设计一个mySQL表示的网页,存储与一个人相关的事件列表。因此,对于这个表/表,它将有2列,其中一列是人名,另一列是事件。然而,一个人通常会有30到1000项活动,所以这个表格,我们计划为我们整个本科班6000名学生准备的,将有数百万的条目。是否有更好的方法将其存储在mySQL中,占用更少的空间,但仍然能够检索单个事件和参加活动的人员列表,就像检索由两列组成的表一样容易?

EN

回答 3

Stack Overflow用户

发布于 2012-09-01 04:48:53

是的,有一种名为“多对多”的技术,本质上是将您的一个表分成三个,当您认为确实有三个实体正在建模时,这一点至关重要(作为一个良好的理智检查)。

  1. 人物
  2. 事件
  3. 人与事件的关联

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

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

这种结构意味着以下几点:

  1. 不管一个人去了多少个事件,一个人只被代表一次。
  2. 活动也是一样,不管有多少人出席。
  3. 考勤是一个“一流”的实体,可以扩展到包含它自己的属性(即“角色”)。

这种结构被称为“多对多”,因为每个人都可以参加许多活动,而且每个活动可能有许多与会者。

该设计的典型特征是没有单一的领域知识重复,只有“键”被重复作为必要的建模现实世界领域。(也就是说,在您的第一个示例中,记录名称更改需要进行数量未知的更新,并可能导致数据异常,而避免数据异常是数据库规范化的主要关切。

票数 3
EN

Stack Overflow用户

发布于 2012-09-01 04:44:03

别担心“太空”。这不是上世纪70年代,我们不会用穿孔卡上的列来存储数据。您应该关注在适当的、最标准化的数据结构中表达您的需求。有了适当的索引,就不会有问题,而不是这样的数据量。

记住,需要将索引定义为WHERE子句的一部分,有时还需要为使用ORDER BYLIMIT获取的大型列表添加额外的索引。

尽可能或实际使用整数标识符而不是字符串。它们存储为少量字节,通常为4个字节,而可变长度字符串通常至少以字节+ 1为单位。

一个正确规范化的数据库无论如何都会使用数字标识符,所以如果事情不是什么大问题的话,这种类型的数据库。只有当您遇到无法使用其他方法轻松解决的合法性能问题时,您才会违背这一点,或者故意地将您的数据去规范化。

与往常一样,通过生成大量的虚拟数据来测试您的模式,并查看它的执行情况。由于您事先对需求有很好的了解,所以在这些级别上进行一些测试,然后,为了安全起见,尝试2x、5x和10倍的数据,看看您的设计有多大的灵活性。只要你知道你将经历什么样的规模,就可以有性能限制。

票数 1
EN

Stack Overflow用户

发布于 2012-09-01 04:23:35

mySQL关系数据库是专门为处理这类问题而设计的。处理数以百万计的条目不是问题。复杂的查询可能需要几秒钟的时间,但是性能非常好。

最好的设计是每一行存储一个事件。你这样做听起来是最好的方法。祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12224856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档