sql - 两列作为主键还是一列作为 PK + 索引?

标签 sql database postgresql primary-key normalization

此表包含用户的照片(缩略图和完整照片)。
大多数查询都会有一个“WHERE user_id =?”条件。

CREATE TABLE photos (
  "photo_id" serial, -- serial is postgres' autoincrement
  "user_id" integer not null, -- foreign key to users table
  "filename_thumbnail_50" varchar not null,
  "filename_thumbnail_75" varchar not null, -- 75px x 75px thumbnail
  "filename_full" varchar not null,
  PRIMARY KEY ("photo_id", "user_id")
);

此用例的最佳设计和/或性能设计是什么:
- 两列主键像上面的例子?
- 一个主键 (photo_id) 和一个 user_id 索引?

最佳答案

主键应遵循您的业务规则,仅此而已。由于照片本身没有“真实的”(即自然的)主键,因此使用序列号作为 PK 绝对有意义。

user_id 扩展主键没有任何意义,也没有任何作用(因为 photo_id 无论如何都是唯一的,你只会增加索引的开销维护)。由于 user_id 是索引中的第二列,因此它不太可能用于限制 user_id 的查询(并非不可能,但不太可能)

所以我会坚持在 photo_id 上使用 PK,并在 user_id 上添加索引(无论如何,索引外键列总是一个好主意)。

关于sql - 两列作为主键还是一列作为 PK + 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131251/

相关文章:

Java - 使用 hibernate 读取从 MYSQL 查询返回的列表

php - 显示序列化数组

database - 如何创建合适的数据库层?

sql - MySQL WHERE IN - 排序

java - 需要一些影片来了解如何使用 MySQL?

postgresql - CentOS 上的 PostgreSQL 和 ESRI Geoportal 安装问题

oracle - 双向复制 SymmetricDS

sql - where子句在spark sql数据框中不起作用

sql - 如何给 PostgreSQL 中的 Trigger 函数提供参数?

sql - 如何在 postgres 中使用 'for statement' 触发器?