我正在处理一个问题,在课堂上设计一个mySQL表示的网页,存储与一个人相关的事件列表。因此,对于这个表/表,它将有2列,其中一列是人名,另一列是事件。然而,一个人通常会有30到1000项活动,所以这个表格,我们计划为我们整个本科班6000名学生准备的,将有数百万的条目。是否有更好的方法将其存储在mySQL中,占用更少的空间,但仍然能够检索单个事件和参加活动的人员列表,就像检索由两列组成的表一样容易?
发布于 2012-09-01 04:48:53
是的,有一种名为“多对多”的技术,本质上是将您的一个表分成三个,当您认为确实有三个实体正在建模时,这一点至关重要(作为一个良好的理智检查)。
您可以将其建模为三个表,前两个表本质上各有两个列:一个具有唯一索引(称为“主键”),第二个是语义名称(人员名、事件名)。请注意,您还可以向这些表中添加任意数量的列,只需增加一个存储因素(很可能您的第一步将是向事件表添加一个日期列)。
第三个表是有趣的表,它只包含两个列,每个列都是对其他表的引用(每一行都是:(person_id,event_id))。我们称之为“外键”。
这种结构意味着以下几点:
这种结构被称为“多对多”,因为每个人都可以参加许多活动,而且每个活动可能有许多与会者。
该设计的典型特征是没有单一的领域知识重复,只有“键”被重复作为必要的建模现实世界领域。(也就是说,在您的第一个示例中,记录名称更改需要进行数量未知的更新,并可能导致数据异常,而避免数据异常是数据库规范化的主要关切。
发布于 2012-09-01 04:44:03
别担心“太空”。这不是上世纪70年代,我们不会用穿孔卡上的列来存储数据。您应该关注在适当的、最标准化的数据结构中表达您的需求。有了适当的索引,就不会有问题,而不是这样的数据量。
记住,需要将索引定义为WHERE子句的一部分,有时还需要为使用ORDER BY和LIMIT获取的大型列表添加额外的索引。
尽可能或实际使用整数标识符而不是字符串。它们存储为少量字节,通常为4个字节,而可变长度字符串通常至少以字节+ 1为单位。
一个正确规范化的数据库无论如何都会使用数字标识符,所以如果事情不是什么大问题的话,这种类型的数据库。只有当您遇到无法使用其他方法轻松解决的合法性能问题时,您才会违背这一点,或者故意地将您的数据去规范化。
与往常一样,通过生成大量的虚拟数据来测试您的模式,并查看它的执行情况。由于您事先对需求有很好的了解,所以在这些级别上进行一些测试,然后,为了安全起见,尝试2x、5x和10倍的数据,看看您的设计有多大的灵活性。只要你知道你将经历什么样的规模,就可以有性能限制。
发布于 2012-09-01 04:23:35
mySQL关系数据库是专门为处理这类问题而设计的。处理数以百万计的条目不是问题。复杂的查询可能需要几秒钟的时间,但是性能非常好。
最好的设计是每一行存储一个事件。你这样做听起来是最好的方法。祝好运。
https://stackoverflow.com/questions/12224856
复制相似问题