我正在建立一个用户可以添加自定义字段和提交数据的应用。我使用Postgresql所以我认为Hstore将是完美的解决方案。还因为它允许查询用户可能引入的自定义数据。我的问题是Hstore只能安装到一个模式中,并且我使用apartment gem进行多租户。因此每个用户在数据库中都有一个模式。
Hstore列中的数据是私有的,因此我不希望其他用户访问它。我该怎么做呢?我更喜欢将这些数据存储到同一个用户的架构中。还有其他解决方案吗?
答案 0 :(得分:4)
Craig告诉你在自己的架构中安装hstore。这意味着要按照这些方式做点什么。
create schema hs;
create extension hstore with schema hs;
nothing 与存储hstore 数据的方式和位置有关。
如果我有一个名为“mike”的个人模式,我会使用像这样的hstore数据类型在“mike”模式中构建表。
create schema mike;
create table mike.test (
some_column_name hs.hstore
);
您可以通过将该架构放在搜索路径中来避免使用“hs”架构名称(如“hs”.hstore)。如果您正在执行“普通”客户端/服务器应用程序,则可能需要在数据库级别设置它。
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”架构中具有特权。
搜索路径中的第一个架构成为新对象的默认架构。另一方面,该模式中的数据库对象可以隐藏其他模式中具有相同名称的数据库对象。把它放在脑海中。
最后,成千上万的行是一个很小的数据库。性能问题可能与您的数据库搜索路径无关。