Hstore 和多租户

Hstore and multitenancy

我正在构建一个应用程序,用户可以在其中添加自定义字段并提交数据。我正在使用 Postgresql,所以我认为 Hstore 将是完美的解决方案。也因为它允许查询用户可能引入的自定义数据。我的问题是 Hstore 只能安装到一个模式中,我正在使用公寓 gem 进行多租户。所以每个用户在数据库中都有一个模式。

Hstore 列中的数据是私有的,因此我不希望其他用户访问它。我怎样才能完成这个?我更喜欢将此数据存储到同一用户的模式中。还有其他解决方案吗?

Craig 告诉您在它自己的架构中安装 hstore。这意味着按照这些思路做一些事情。

create schema hs;
create extension hstore with schema hs;

这与您存储 hstore 数据 的方式和位置没有任何关系

如果我有一个名为 "mike" 的个人模式,我会在 "mike" 模式中使用这样的 hstore 数据类型构建表。

create schema mike;
create table mike.test (
  some_column_name hs.hstore
);

您可以通过将该架构放在搜索路径中来避免必须使用 "hs" 架构名称(如 "hs".hstore)。如果您正在做一个 "normal" client/server 应用程序,您可能希望在数据库级别设置它。

alter database your_database_name set search_path TO mike, hs, public;

但是在您的多租户架构中,每个租户有一个模式,您可能希望每个租户有一个数据库角色,并且您会可能 想为每个角色设置搜索路径。 (我不熟悉 "apartment" gem;我假设它为每个租户创建一个角色,为每个租户创建一个模式。通过检查数据库模式来验证这一点。)

alter role one_role_name set search_path to one_role_name, hs, public;

我还想验证架构上的合理权限。例如,在像您这样的多租户架构中,我想验证只有 "mike" 在 "mike" 架构中具有特权。

搜索路径中的第一个架构成为新对象的默认架构。另一方面,该模式中的数据库对象可以隐藏其他模式中同名的数据库对象。请记住这一点。

最后,数千行是一个微型数据库。性能问题可能与您的数据库搜索路径无关。