PostgreSQL的:它更好使用多个数据库,每个1种模式,或1个数据库与多个模式?PostgreS

2019-05-12 14:58发布

后此评论我的问题之一,如果使用更好的数据库1与X模式或反之亦然我想。

我的情况:我正在开发一个web应用程序,其中,当人们登记,我创建(实际上)的数据库(不,它不是一个社交网络:每个人都必须能够访问自己的数据,而不会看到其他用户的数据)。

这是我用以前的版本我的应用程序(这仍然是在MySQL运行)的方式:通过API的Plesk,针对每个注册,我做的:

  1. 创建具有受限权限的数据库用户;
  2. 创建可以只由先前创建的用户和超级用户(维护)来访问数据库
  3. 填充数据库

现在,我需要做同样的在PostgreSQL(该项目也越来越成熟和MySQL ..没有满足所有的需求)

我需要所有的数据库/模式的备份独立:pg_dump的作品完美的左右逢源,同样为可配置访问仅有1模式或1个数据库中的用户。

因此,假设你是有经验的用户potsgres比我,你觉得什么是最好的解决方案我的情况,为什么?

使用$ X分贝,而不是$ X的模式会不会有性能差异? 什么解决方案将是保持更好的未来(可靠性)?

编辑 :我差点忘了:我所有的数据库/模式总是具有相同的结构!

EDIT2:对于备份问题(使用pg_dump的),也许是更好的,使用1种DB和多模式,倾倒在一旦所有的模式:复苏将是相当简单的加载在开发计算机的主要转储,然后转储和恢复只需要架构:有1个额外的步骤,但倾倒所有的模式似乎更快然后dumpin逐一。

PS:对不起,如果我忘了文本进行一些“W”字符,我的键盘遭受该按钮;)

UPDATE 2012

那么,应用结构和设计改变了这么多dirung那最后两年。 我还在使用1 db with many schemas的做法,不过,我有我应用程序的每个版本 1个数据库:

Db myapp_01
    \_ my_customer_foo_schema
    \_ my_customer_bar_schema
Db myapp_02
    \_ my_customer_foo_schema
    \_ my_customer_bar_schema

对于备份,即时通讯定期倾倒的每个数据库,然后开发服务器上移动备份。

林还使用PITR / WAL备份,但正如我之前所说的,它不太可能我就必须恢复所有数据库一次..所以它可能会在今年解雇(在我的情况是不是最好的方法)。

1-DB-多对一模式的工作方式对我非常好,因为现在,即使该应用程序的结构完全改变:

我差点忘了:我所有的数据库/模式总是具有相同的结构!

...现在,每个模式都有自己的结构,改变dinamycally反应用户的数据流。

Answer 1:

PostgreSQL的“模式”是大致相同MySQL的“数据库”。 在PostgreSQL安装可以得到问题有许多数据库; 有许多模式将与任何麻烦的工作。 所以,你一定要去与数据库中的一个数据库和多个模式。



Answer 2:

当然,我会去的1-DB-多对多模式的方法。 这使我倾倒所有的数据库,但只恢复1很容易,在许多方面:

  1. 转储数据库(所有架构),加载转储在一个新的数据库,只转储模式,我需要和恢复回到主分贝
  2. 分别转储模式,一个接一个(但我觉得机器会遭受更多的这种方式! - 和我期待像500个架构)

否则,周围的Googling我见过,没有自动程序来复制模式(用它作为模板),但许多人认为这种方式:

  1. 创建一个模板架构
  2. 当需要复制,使用新名称将其重命名
  3. 转储
  4. 将其重命名
  5. 还原转储
  6. 魔术完成。

我在蟒蛇做书面2行; 我希望他们能够帮助别人(以2秒编写代码,在生产中不使用它):

import os
import sys
import pg

#Take the new schema name from the second cmd arguments (the first is the filename)
newSchema = sys.argv[1]
#Temp folder for the dumps
dumpFile = '/test/dumps/' + str(newSchema) + '.sql'
#Settings
db_name = 'db_name'
db_user = 'db_user'
db_pass = 'db_pass'
schema_as_template = 'schema_name'

#Connection
pgConnect = pg.connect(dbname= db_name, host='localhost', user= db_user, passwd= db_pass)
#Rename schema with the new name
pgConnect.query("ALTER SCHEMA " + schema_as_template + " RENAME TO " + str(newSchema))
#Dump it
command = 'export PGPASSWORD="' + db_pass + '" && pg_dump -U ' + db_user + ' -n ' + str(newSchema) + ' ' + db_name + ' > ' + dumpFile
os.system(command)
#Rename back with its default name
pgConnect.query("ALTER SCHEMA " + str(newSchema) + " RENAME TO " + schema_as_template)
#Restore the previus dump to create the new schema
restore = 'export PGPASSWORD="' + db_pass + '" && psql -U ' + db_user + ' -d ' + db_name + ' < ' + dumpFile
os.system(restore)
#Want to delete the dump file?
os.remove(dumpFile)
#Close connection
pgConnect.close()


Answer 3:

我会说,去与多个数据库和多个模式:)

在Postgres的模式有很多像Oracle包,如果你所熟悉的那些。 数据库是指整个数据集之间进行区分,而模式更像是数据实体。

例如,你可能对与模式“UserManagement”整个应用程序一个数据库,“LongTermStorage”等。 “UserManagement”将包含然后“用户”表,以及所有存储过程,触发器,所需要的用户管理序列等。

数据库是整个程序,模式是组件。



Answer 4:

一些模式的应该比许多数据库更轻巧,但我找不到它证实了这一点参考。

但如果你真的想保持的东西非常不同的(而不是重构的Web应用程序,这样一个“costomer”列被添加到您的表),你可能仍然要使用单独的数据库:我断言,您可以更轻松地进行的恢复特定客户的数据库,这种方式 - 而不会干扰其他顾客。



Answer 5:

在一个Postgres-方面,我建议使用一个分贝多个模式,你可以(例如)UNION ALL跨越模式而不是整个数据库。 出于这个原因,数据库是真正完全从另一个数据库,同时隔离模式不在同一个数据库中,从其他模式绝缘。 如果你 - 对于一些reason-必须巩固在未来跨模式的数据,它会很容易在多个模式来做到这一点。 随着多个数据库就需要多个数据库的连接,收集并从每个数据库“手动”的应用程序逻辑合并数据。

后者在某些情况下的优点,但对于大部分我认为一个数据库,多模式的做法是比较有用的。



Answer 6:

获取的事情讲清楚首先你最想作一些Db的只读,时间有些读/写因此,保持作为读取模式只能保持在DIFF DB和读取DIFF数据库/写模式虽然我建议你保持MAX 25-30架构在一个DB,你不想对日志所有模式创建数据库的负载

这是一篇文章如果u想了解更多



文章来源: Postgresql: is it better using multiple databases with 1 schema each, or 1 database with multiple schemas?