我为我的新手问题道歉,但我是PostgreSQL和模式的新手.我很难理解PostgreSQL中模式的用途.总的来说.模式的潜在用例是什么?

"我有"这本书说,模式就像不能嵌套的目录.好的,所以我认为模式是在数据库中对表进行分组的一种方法.这本书没有讨论这是如何实现的,也没有提到它的潜在用途,除了一个微不足道的例子(下一段).

A Benefit & Potential use case #1

到目前为止,我只理解了模式的一个好处(看似微不足道).这样做的好处是,可以有多个具有相同名称的表,并且只要每个这样的表位于不同的模式中,就不会有冲突,因为可以使用名称空间限定符(模式名称)来处理所需的特定表.

我真的不明白为什么一开始就有多个同名的表.我认为这是一种极其罕见的情况,然而这些文档给我带来的感觉就像模式应该被每个人使用一样.在我看来,拥有多个同名的表似乎不是很好的项目管理,而且考虑到这种糟糕的做法似乎没有价值. 到头来,你只会让事情变得一团糟.

我能想到的唯一一种情况是,当你有一个正在学习SQL的班级,学校IT管理员希望每个学生都能创建自己喜欢的表格时,表名冲突应该被允许.当然,我脑海中的问题是,为什么管理员不 for each 学生创建一个db,而不是为所有学生创建一个db, for each 学生创建一个模式?为什么?

还有哪些用例显示了模式的好处?

IMPLEMENTATION - OR - NATURE OF

I'm also confused about the implementation/nature of schemas.
Let us assume that we have 1 DB which has 3 schemas. 1 schema per user as such:
user1='admin' -- tableA, tableU, tableJ, tableK,
user2='joe' ------ tableU, tableJ,
user3='kate ----- tableU, tableK.

在上面的示例中,我的目的是让tableU在用户之间共享(通过架构Joe&架构Kate).他们不应该得到他们自己的表的独立副本,他们应该共享对这个表的公共访问.这种用法对我来说是有意义的.用户应添加/修改/可能删除记录.未添加/修改/删除表格.但是,我不确定PostgreSQL模式是否可以做到这一点.Q2:如果我要如上所述共享Tableu,架构Joe&schema Kate会各自获得您自己的表副本,或者我是否可以指定他们不应该获得自己的副本,而只是共享对现有表的访问权限?

tableJ等于same等于tableK...除了Kate不能用tableJ和joe不能用tableK.根据我对图式的有限理解,这似乎是图式的本质.Q3: for each 用户制作一份表格的目的是什么?这两个表具有相同的 struct (列和约束), for each 用户制作这样一个表的独立副本是对存储空间的浪费.我还认为,如果每个用户都有自己的每个表的副本,那将是一场噩梦.我们将把规范化等关键概念抛到窗外.这将是一个无法维持的烂摊子.在我看来,每个用户都应该在公共数据库的公共表中添加/修改/删除记录.

在我的谷歌搜索中,我看到人们关于模式的搜索为他们网站的每个在线客户创建了一个单独的模式+表.他们有大约Q4:,000个模式.Q4:我这里漏掉了什么?至少可以说,这似乎很极端.他们应该将记录添加到每个客户的标准表中,而不是 for each 客户创建模式和表.这只会增加我的念力.

不管怎样,我希望我的念力的要点已经说得够清楚了.

我要找的是:
(1)通过实际用例,明确模式的好处.
(2)明确模式的实现细节.


EDIT v.3

Potential use case #2

如果我对Neville K的理解正确的话,他建议将其作为一个用例:

1 DB which has 3 schemas. 1 schema per user as such (username==schema_name in ex.):
user1='admin' -- tableA, tableLogin, tblFin1, tblFin2, tblFin3, tblPrj1, tblPrj2, tblPrj3.
user2='joe' ------ tableLogin, tblFin1, tblFin2, tblFin3
user3='kate ----- tableLogin, tblPrj1, tblPrj2, tblPrj3.

这里,乔在财务部,凯特是项目经理.Joe使用的应用程序仅限于与财务相关的表,Kate使用的应用程序仅限于项目管理表.这一限制是通过将他们的用户名绑定到绑定到搜索路径的架构(在DB级别实施)来实施的.

Q5:如果没有模式,同样的限制难道不存在吗?哪些表可供哪个应用程序使用,取决于在开发团队开发应用程序时,应用程序要使用哪些表.不或者我们假设我们使用的是现成的应用程序,您指向一个数据库,我们担心该应用程序在其设置中不能被限制为某些表(并且该限制在现成的应用程序中用密码锁定)?

Potential use case #3

如果我对Catcall的理解是正确的,他建议将其作为一个用例:

您希望将托管在一个物理系统上的数据库服务器的服务出租/出租给多个需要数据库服务的客户的场景.因此,出现了类似多租户的场景.此时,您可以 Select :
(1)每个租户(客户)一个单独的数据库
-更安全、更方便,但每个系统支持的租户更少.
(2)一个共享数据库,每个租户(客户)有一个模式
-安全性较差,方便性稍差,但每个系统可支持更多租户.

Potential use case #4

如果我对Scott Marlowe和Catcall的理解是正确的,另一个用例应该是:

在开发过程中使用模式隔离开发人员的新内容.以后可以将工作合并到另一个模式.

推荐答案

我在我的谷歌搜索中看到了一些人 关于架构使单独的 每个在线客户的架构+表 到他们的网站.他们有像这样的 100,000个模式.问题3:我错过了什么? 这里?这似乎是极端的说法, 至少.他们应该正在添加记录 至每个客户的标准表 不 for each 模式和表创建模式和表 顾客.

每个租户(客户)一个数据库很容易构建,它为租户之间提供了最强的隔离,并提供了最简单的灾难恢复.但是相对来说比较贵.

每个租户一个模式也很容易构建.租户之间的隔离程度较低.与每个租户使用一个数据库相比,一个dbms可以 for each 服务器支持更多租户,每个租户使用一个模式.一个租户的灾难恢复比每个租户一个数据库更复杂.

共享架构要求每一行都有租户标识符.硬件和备份更便宜;对于一个租户来说,灾难恢复可能真的很糟糕.(要恢复单个租户的数据,您必须恢复每个表中的一些行.发生这种情况时,所有租户的性能都会受到影响.)隔离更加棘手.由于租户共享表,确保没有租户可以访问其他租户数据比每个租户使用一个数据库或一个模式要困难得多.

这些东西的搜索词是"多租户数据库设计".所以也有一个的标签.

另一个常见用途是将属于一起的数据库对象分组.例如,如果您正在开发一个会计数据库,那么实现" payable 账款"功能的所有对象都可能位于"ap"模式中.我也对PostgreSQL扩展使用模式.在我的数据库中,我在"hst"模式中安装了hstore扩展,在"tbf"模式中安装了tablefunc扩展,等等.

Database相关问答推荐

更新数据后,TableView停止按搜索栏进行筛选

在多组MongoDB中查找最新文档的有效方法

如何正确创建mongo模型和客户端?

如何在 N1QL 查询(Couchbase 查询)中使用 LENGTH() 字符串函数

动态数据模型

SQL 历史(history)表设计

将 `tsv` 文件插入 postgresql 数据库

如何更改 SQLite 数据库列中的值?

将图像文件存储在 Mongo 数据库中,这是个好主意吗?

如何将数据库从一台计算机复制到另一台计算机?

在 SQL SERVER 中监视 SQL 查询的进度

我应该如何使用 MySQL 构建我的设置表?

在 SQL Server 2008 中区分两个表架构的最简单方法是什么?

如何将 Android 手机上的 SQLite 数据库与服务器上的 MySQL 数据库同步?

如何使用 Hibernate 在不丢失数据的情况下更新数据库模式?

SQL - 如何转置?

如何一次插入1000行

Python中的内存数据库

使用 Sinatra 时与数据库对话的最佳方式是什么?

如何在 Java 中检测 SQL 表的存在?