在进入“NoSQL”领域多年之后,现在我遇到了一个本质上非常“关系”的问题。今天,我看到数据存储的眼光与以前截然不同。像 Riak 这样的事情已经让我无法忍受单点故障,“停机维护”等。当然,(或者我希望),我还没有完全失去理智。这是一个个人项目,还没有(或尚未)具有极高的要求。
大多数分片解决方案都没有给我我想要的(至少是一瞥),可能是因为我的问题很“容易”解决。至少在概念层面上(忽略 RDBM 本身带来的限制)。
我有少量“共享”数据,可以自由复制。它没有硬一致性的要求。这可以存储在类似发电机的数据库中,并且可以无限扩展。但如果可能的话,我仍然希望使用单个数据库。
我有很多“每用户”数据。也就是说 - 大量用户,每个用户都拥有绝对合理大小的数据,真正适合存储在单个 PostgreSQL 节点上。我们正在谈论最多 10 万条记录。
我从不需要跨用户查询,也不需要跨用户原子性。
这听起来非常容易实现。至少当我用我的“NoSQL 眼睛”看它时。
以下是我幼稚的入门想法:
在极端情况下,我可以将整个用户序列化为 Riak 中的单个键/值。当然,持续对几兆字节数据进行反/序列化会很慢,这就是我考虑使用 PostgreSQL 的原因。许多 Riak K/Vs 是行不通的,因为我需要每个用户数据中的原子性/事务。
我可以为每个用户使用一个 SQLite 数据库,并使用 GlusterFS 之类的东西来实现冗余/可用性。如果我无法使用 PostgreSQL 找到同样好的东西,这可能是我要选择的解决方案。优点:可以很好地缩小/放大;缺点:我更喜欢 PostgreSQL 的类型和严格性而不是 SQLite
所以,我最好从 PostgreSQL 分片解决方案中要求:
我在 psql 中运行了以下 SQL:
CREATE USER bspu LOGIN;
CREATE DATABASE bsp OWNER bspu;
GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;
\c bsp
CREATE TABLE users (
id SERIAL PRIMARY KEY,
client_id VARCHAR(20) NOT NULL,
api_key VARCHAR(100) NOT NULL,
api_secret VARCHAR(100) NOT NULL,
auth_token VARCHAR(128) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
当我以 身份登录bspu并尝试查询users表时,出现错误:
Run Code Online (Sandbox Code Playgroud)permission denied for relation users
我尝试运行:
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;
Run Code Online (Sandbox Code Playgroud)
但它没有帮助。我究竟做错了什么?为什么数据库所有者没有权限查询自己的数据库?
编辑:我bspu现在升级为超级用户,所以我可以继续工作。任何进一步的指导表示赞赏。
我非常喜欢bash的反向搜索历史(Cr)(命令行功能):
从当前行开始向后搜索,并根据需要在历史记录中“向上”移动。这是一个增量搜索。
当我进入control-r时bash,我得到以下信息:
(reverse-i-search)`':
Run Code Online (Sandbox Code Playgroud)
而且我能够输入以前执行过的命令的字符,并仔细研究我正在寻找的内容。如果我出错了,我可以输入control-h擦除一个字符(相当于backspace)。
这个命令行功能使得引用以前执行的命令变得非常容易。我想知道psql. 我发现仅依赖control-pand是非常低效的control-n。
对于它的价值,我正在使用PostgreSQL 9.3.1 on x86_64-apple-darwin13.0.0, compiled by Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn), 64-bit- 通过Postgres.app获得。
我正在尝试运行以下查询以提供patients表中具有refinst列值的行的百分比。我一直得到0的结果。
select (count (refinst) / (select count(*) from patients) * 100) as "Formula"
from patients;
Run Code Online (Sandbox Code Playgroud)
该表有 15556 行,并select count(refinst) from patients告诉我其中 1446行在列中有值refinst。我想从查询中得到的响应是 30.62 ( 1446/15556*100=30.62XXXXX,四舍五入到两位小数)。
我很确定它与计数结果的数据类型(我假设是整数)有关。如果我将一个整数除以一个整数并且结果小于 0,它会被截断为 0 是否正确?如果是这种情况,有人可以告诉我如何将计数结果转换为带有 2 个小数位的数字,以便结果也四舍五入到 2 个小数位吗?
我确信有比多个 count 语句更好的方法来编写此代码。我正在寻找一种更高效的方式来编写这个查询。
我已经获得了我的 PostgreSQL 数据库的转储:
pg_dump -U user-name -d db-name -f dumpfile
Run Code Online (Sandbox Code Playgroud)
然后我继续在另一个数据库中恢复:
psql X -U postgres -d db-name-b -f dumpfile
Run Code Online (Sandbox Code Playgroud)
我的问题是数据库包含引用约束、检查和触发器,其中一些(特别是检查)在恢复过程中失败,因为信息没有按照会导致这些检查得到遵守的顺序加载。例如,在表中插入一行可能与CHECK调用一个plpgsql函数相关联,该函数检查某个条件是否在某个其他不相关的表中成立。如果后者没有psql在前者之前加载,则会发生错误。
下面是一个 SSCCE,它产生了这样一个一旦转储pg_dump就无法恢复的数据库:
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO …Run Code Online (Sandbox Code Playgroud) postgresql database-design postgresql-9.1 pg-dump check-constraints
我的restrictionsPostgreSQL 数据库中有一个小(约 10 行)表,其中每天删除和插入值。
我想要一个名为 的表restrictions_deleted,从中删除的每一行都restrictions将自动存储。由于restrictions具有序列号,因此不会有重复项。
如何在 PostgreSQL 中编写这样的触发器?
我正在使用一个使用(本地)postgres 数据库并将一些信息存储在临时表中的 Windows 应用程序。我想看看临时表,但是 pgadmin 和 dbVis 告诉我:ERROR: cannot access temporary tables of other sessions在尝试查询数据时。我尝试更改架构和表的权限,但这似乎没有帮助,即使我使用与程序本身相同的用户访问数据库(至少在 dbVis 中)。是否有我可以在我的数据库中更改的设置,允许我对数据库中的所有会话进行“root”访问?
我是 postgresql 的新手,如果您能就如何解决以下错误提出建议,我将不胜感激。
我发出了以下命令:
ip_spotlight-# REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA doc FROM PUBLIC ;
ip_spotlight-# REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA net FROM PUBLIC ;
ip_spotlight# GRANT USAGE ON SCHEMA doc TO netopsapp ;
ip_spotlight-# ALTER DEFAULT PRIVILEGES IN SCHEMA doc GRANT ALL ON TABLES TO netopsapp ;
ip_spotlight-# ALTER DEFAULT PRIVILEGES IN SCHEMA net GRANT ALL ON TABLES TO netopsapp ;
Run Code Online (Sandbox Code Playgroud)
以下是特权列表:
ip_spotlight# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------ …Run Code Online (Sandbox Code Playgroud) 我在 CentOS 7.3 环境下安装了 PostgreSQL 10.1。
服务已启动(postmaster.pid文件存在于 下/var/lib/pgsql/10/data),但我需要在pg_hba.conf.
但是,尝试不同的命令,我得到以下信息:
pg_ctl reload -D /var/lib/pgsql/10/data
bash: pg_ctl: command not found
service postgresql reload
Redirecting to /bin/systemctl reload postgresql.service
Failed to reload postgresql.service: Unit not found.
Run Code Online (Sandbox Code Playgroud) 我有一个专栏: standard BOOLEAN NOT NULL
我想强制执行一行 True,而所有其他行都是 False。根据此约束,没有 FK 或其他任何东西。我知道我可以用 plpgsql 完成它,但这似乎是一个大锤。我更喜欢 a CHECKorUNIQUE约束之类的东西。越简单越好。
一行必须为 True,它们不能全部为 False(因此插入的第一行必须为 True)。
该行将需要更新,这意味着我必须等待检查约束,直到更新完成,因为所有行可能先设置为 False,然后再将一行设置为 True。
products.tax_rate_id和之间有一个 FK tax_rate.id,但它与默认或标准税率无关,用户可选择以轻松创建新产品。
PostgreSQL 9.5 如果重要的话。
表是税率。其中一种税率是默认值(standard因为默认值是 Postgres 命令)。添加新产品时,标准税率适用于该产品。如果没有standard,则数据库必须进行猜测或进行各种不需要的检查。我想,简单的解决方案是确保有一个standard.
上面的“默认”是指表示层(UI)。用户可以选择更改默认税率。我要么需要添加额外的检查以确保 GUI/用户不会尝试将 tax_rate_id 设置为 NULL,或者只是设置默认税率。
postgresql ×10
permissions ×2
psql ×2
cast ×1
centos-7 ×1
command-line ×1
constraint ×1
count ×1
datatypes ×1
delete ×1
mac-os-x ×1
partitioning ×1
pg-dump ×1
pg-hba.conf ×1
pgadmin ×1
plpgsql ×1
trigger ×1