如何在postgres 9.3中存储一些关系数据(例如用户角色)?

时间:2013-11-27 22:05:02

标签: sql postgresql database-design database-schema

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

  • e.g。每个用户有什么角色(编辑,出版商,管理员,观众, 贡献者)
  • e.g。 app可读的文件扩展名(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)
);

要求是

  • 实体(例如用户)可以分配0,1或N个项目(例如角色),其中N <20
  • 数据必须能够快速过滤(例如,选择所有具有role = publisher的用户)

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

2 个答案:

答案 0 :(得分:3)

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

我总是试图使用PostgreSQL的所有酷炫功能,但经过仔细分析后,旧的方式通常仍然是最好的。

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

如果连接真的打扰你,你可以使用视图,但我怀疑它会有很大的不同。

答案 1 :(得分:1)

使用像postgres这样的RDBMS时,您需要存储在关系中的数据。这就是它的设计目标。 Arrays和JSON打破了这一点,并且更难以处理数据。如果此信息足以存储在数据库中,则应设计表以正确存储它。

您可能还想阅读this。这基本上是关于某人决定将关系数据存储在nosql数据库中的故事,并对此表示遗憾。同样的想法适用于以非关系数据库格式存储关系数据(比如将json放在列中)。