【问题标题】:How to store a handful of relational data (e.g. user roles) in postgres 9.3?如何在 postgres 9.3 中存储少量关系数据(例如用户角色)?
【发布时间】:2026-02-07 17:15:02
【问题描述】:

在 postgres 9.3 中存储少量关系数据的最佳方式是什么?

  • 例如每个用户的角色(编辑、发布者、管理员、查看者、 贡献者)
  • 例如应用程序可读的文件扩展名(pdf、txt、epub、 rtf)

通常情况下,这会像...

CREATE TABLE users (
id SERIAL,
...
);

CREATE TABLE roles (
id SERIAL,
name VARCHAR(50), -- editor, publisher ...
description VARCHAR(50) -- ideally, UI display would be different than database codename, e.g. "Administrator" for "admin"
);

CREATE TABLE user_roles (
user_id int,
role_id int,
...
PRIMARY KEY (user_id, role_id)
);

要求是

  • en 实体(例如用户)可以分配 0、1 或 N 个项目(例如角色),其中 N
  • 数据必须能够快速过滤(例如,SELECT all users with role=publisher)

考虑到 N

【问题讨论】:

  • 如果您的用户群很大,请在 user_roles 中的每个 FK 上建立索引。坚持使用 3nf(正如您所做的那样)并且不在用户行上指定角色是很好的。

标签: sql postgresql database-design database-schema


【解决方案1】:

根据我的个人经验,没有更好的方法来存储它。关系数据库引擎就是为此而构建的。

我也总是很想使用 PostgreSQL 的所有很酷的功能,但经过仔细分析,旧方法通常仍然是最好的。

连接三个表可能不方便,但使用 JSON、XML 或数组查询也会变得困难和混乱。而且它们通常会慢很多,因为它们不能使用索引以及简单的选择和连接。

如果连接真的让您感到困扰,您可以使用视图,但我怀疑它会产生很大的不同。

【讨论】:

  • 进展如何? @user2528332
【解决方案2】:

在使用像 postgres 这样的 RDBMS 时,您希望数据存储在关系中。这就是它的设计目的。数组和 JSON 打破了这一点,使处理数据变得更加困难。如果此信息足够重要以存储在数据库中,则应设计表以正确存储它。

您可能还想阅读this。这基本上是一个关于某人决定将关系数据存储在 nosql 数据库中并后悔的故事。同样的想法也适用于以非关系数据库格式存储关系数据(例如将 json 放入列中)。

【讨论】: