mysql - 我应该使用复合主键(聚集索引)还是代理键和辅助索引?

标签 mysql database database-design amazon-aurora

问题陈述

我有以下候选键

{Student Id, Entity Id, Action Id......}

我正在尝试决定是否应该使用复合主键或代理(自动增量整数或时间戳或 guid)键。

研究与分析

我在 stackoverflow 上查找了一些问题和讨论,但没有得到针对我的场景的明确方向。

Should a composite key be e primary key

Compositve primary key or primary surrogate key

以下是表的访问模式

写操作

数据被存储到此表中以响应学生在网络应用程序中的操作;即我们可以将其视为捕获用户对不同实体的操作的时间序列数据。在一段时间内,我预计同时登录网络应用程序的学生数量会非常高(取决于学生群体对产品的采用程度!)。因此,我期望随着时间的推移会有大量的并发写入和较大的表大小。

读取操作

每当学生登录系统时,每个学生都可以访问该表,以向他显示其过去行为的总体摘要。

计划方法

考虑到访问模式、表的预计大小以及数据的时间序列性质(事件!),我更倾向于使用唯一的代理键(自动增量整数)和复合辅助键以获得写入和读取性能的最佳平衡。另一种选择是创建复合主键并避免使用代理键。

您能否验证我的方法或就我的方法的替代方案或改进提出建议?

最佳答案

从技术上讲,您最好使用复合键。唯一的缺点是它不适合实体。

我的意思是,随着时间的推移,M:N 可能会成为一个实体。它将获得列,并且其各个行将被操作和引用,这对于复合键来说是复杂的。

另一侧的普通 M:N 表需要在引用列上具有唯一键,因此将其用作主键很有意义。您摆脱了额外的 ID 列、序列和附加索引。

关于mysql - 我应该使用复合主键(聚集索引)还是代理键和辅助索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53494565/

相关文章:

database - 比较相似的单词和短语

sql - 存储和比较独特的组合

mysql - 从多个表中检索所有内容

mysql - mysql 查询中的 DATE_ADD 问题

android - Android 应用程序使用哪种数据库?

javascript - 如何在sequalizejs LINUX环境中批量创建时保持顺序?

database - 为购物车应用程序设计数据库?

mysql - 查询创建2点之间不存在的记录

php - 使用 PDO 调用 mysql 过程出现一般错误

java - 从 Oracle blob 字段中提取文件;