我有一个postgresql数据库,用于一个软件即服务,拥有数百个客户。目前为每个客户都有一个postgresql架构,但是由于客户数量迅速增加,我需要一种更好的解决方案。我了解了cassandra的相关知识,但是我不想失去主键、外键和检查约束的完整性。我也研究了postgresql在分布式系统中的应用,但目前我不知道最好的实现方式是什么。
我有一个postgresql数据库,用于一个软件即服务,拥有数百个客户。目前为每个客户都有一个postgresql架构,但是由于客户数量迅速增加,我需要一种更好的解决方案。我了解了cassandra的相关知识,但是我不想失去主键、外键和检查约束的完整性。我也研究了postgresql在分布式系统中的应用,但目前我不知道最好的实现方式是什么。
您可以按以下四个层次区分客户:
为每个客户运行单独的PostgreSQL集群。这样可以提供最大的隔离性;每个客户都在不同的端口上,有自己的系统表、事务日志等。
将每个客户放入相同集群中的不同数据库中。这样,他们每个人都有单独的登录名,但使用相同的端口号,并共享全局表如pg_database。
在同一数据库中为每个客户提供单独的模式。如果他们只通过您的软件连接,则不需要单独的用户ID,因为您可以设置search_path。当然,如果您愿意,也可以使用单独的用户ID。
使customer_id成为每个表主键的一部分,并确保在您的软件中进行限制。这可能比为每个数百个用户创建重复表要更好,但必须非常小心,始终通过customer_id限定查询。
有些人已知会组合这些技术,例如,将每个集群限制为100个数据库,每个客户有一个单独的数据库。
除非有更多详细信息,否则很难知道哪种配置对您的情况最好,除非要允许用户直接访问数据库,而不通过您的软件,否则需要考虑每个选项中系统表中的可见内容。从用户角度查看pg_database、pg_user和pg_class,以查看公开的内容。