我为我的新手问题道歉,但我是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的理解是正确的,另一个用例应该是:
在开发过程中使用模式隔离开发人员的新内容.以后可以将工作合并到另一个模式.