我正在用MySQL创建一个数据库,用于学校项目中的音乐流应用程序。它有一个表“song_discoveries”,该表包含以下列:user_id,song_id和discovery_date。它没有主键。“user_id”和“song_id”是外键,“discovery_date”是自解释的。我的问题是我想确保这个表中没有重复的行,因为显然用户可以发现一首歌一次,但我不确定是对所有列使用唯一约束还是创建所有列的组合主键。我主要关心的是什么是最佳实践,哪种方法性能更好?这些方法是否有替代方法?
agyaoht71#
如果目标是创建“此表中没有重复行”。那么要做到这一点,您需要确定是什么使记录“唯一”。如果唯一性由组合user_id,discovery_date和song_id保证,那么它应该是您的主组合键。再考虑一下,如果我们应用一个规则,即“一首歌只能被发现一次!”那么您的组合主键应该是user_id,song_id(这将保证您不会多次添加同一首歌曲),但如果您可以在多天内发现同一首歌曲,则可以保留键作为3个字段的组合。
CREATE TABLE song_discoveries ( user_id int NOT NULL, song_id int NOT NULL, discovery_date DATE NOT NULL, PRIMARY KEY (user_id, song_id) );
jmo0nnb32#
在MySQL中,表存储为按主键排序的 * 聚集索引 *。如果表没有主键,但对非NULL列有唯一键约束,则唯一键将成为聚集索引,其作用几乎与主键完全相同。这两种情况在性能上没有差别。非NULL列上的主键和唯一键之间的唯一区别是可以指定唯一键的名称,但主键始终称为PRIMARY。
PRIMARY
2条答案
按热度按时间agyaoht71#
如果目标是创建“此表中没有重复行”。那么要做到这一点,您需要确定是什么使记录“唯一”。如果唯一性由组合user_id,discovery_date和song_id保证,那么它应该是您的主组合键。再考虑一下,如果我们应用一个规则,即“一首歌只能被发现一次!”那么您的组合主键应该是user_id,song_id(这将保证您不会多次添加同一首歌曲),但如果您可以在多天内发现同一首歌曲,则可以保留键作为3个字段的组合。
jmo0nnb32#
在MySQL中,表存储为按主键排序的 * 聚集索引 *。
如果表没有主键,但对非NULL列有唯一键约束,则唯一键将成为聚集索引,其作用几乎与主键完全相同。这两种情况在性能上没有差别。
非NULL列上的主键和唯一键之间的唯一区别是可以指定唯一键的名称,但主键始终称为
PRIMARY
。