sql - 如何在 postgres 9.3 中存储少量关系数据(例如用户角色)?

标签 sql postgresql database-design database-schema

在 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<20
  • 数据必须能够快速过滤(例如选择具有 role=publisher 的所有用户)

考虑到 N<20,是否有替代的、有效的、更容易使用的方法来存储它? (也许是数组或 json?) 如果是这样,架构定义、INSERT 和上面的 SELECT 查询会是什么样子?

最佳答案

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

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

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

如果联接确实让您烦恼,您可以使用 View ,但我怀疑它会有多大区别。

关于sql - 如何在 postgres 9.3 中存储少量关系数据(例如用户角色)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20253978/

相关文章:

sql - Postgresql 组中的前 N ​​项 WHERE N 是可变的

postgresql - 如果字段为 True,Postgres 检查相关表是否有条目

mysql - 多语言翻译

sql - 如何在 postgresql 中导入 csv/数据

SQL - UPDATE 中每个 SET 命令的 WHERE 子句?

Django 管理数据错误 : Value too long for type character varying(150)

sql - 如何证明在 SQL 中使用子选择查询会降低服务器的性能

database - 一对多数据库关系

mysql - 无法使用 LOAD DATA INFILE | -secure-file-priv 问题

java - jOOQ,Query的异步执行