我的理解是,在网站/数据库上注册新用户的方法是在用户表中创建一个新条目。此后,每当我们想从另一个数据表中检索特定的用户数据时,我们都必须查询用户表以获取我们的用户 ID(当然,如果它还没有存储),在针对我们的数据的新查询中使用该 ID桌子。如果有人想要更模块化的设计,我们可以为每个新用户创建一个新数据库,尽管这不像第一种方法那样流行。我不确定我的理解是否正确,所以请在您认为合适的地方纠正我。
我正在思考的是,在恰好是我最喜欢的播放器的 PostgreSQL 中,您可以使用模式。模式就像数据库中的数据库。然后,当您进行查询时,您可以在表名前加上模式名称,并在其间添加一个点。就像模式是一个类并且您想要访问其中的静态属性一样。我只是喜欢这个符号!
..那么为什么我没有一个数据库来存储与管理相关的东西,甚至可能是一个用户表。但是我有另一个仅用于用户数据的数据库,每个用户都有自己的模式。然后,我需要在我的 PHP:s 用户类中存储的只是一个保存此模式名称的变量,并且每次要从数据库中检索用户特定数据时,都会使用此变量。
注册新用户的最佳做法是什么,该做什么和不该做什么?您能看到架构设计的任何优点或缺点吗?
编辑
因为这个问题让我对我的最终目标感到有些困惑,所以我将在这里澄清我的问题。实际上,数据库设计有点复杂,但是假设我的 Web 应用程序中有三个类。其中一个,在此称为 Foo,可选地与其他两个 Bar1 和 Bar2 处于 has-a 关系。我网站的注册用户可以“创建”任意数量的 Foo、Bar1 和 Bar2,它们相互独立。
Foo 当前存储在数据库中的多个表中。这是他的主表,其中有一个递增的序列:
TABLE foo
(
foo_id serial NOT NULL,
title text
CONSTRAINT foo_pk PRIMARY KEY (foo_id)
)
让我们不要深入研究任何其他表的细节或 Bar 的存储方式。我已经注意只有尽可能少的表,但是,我仍然必须根据实体关系及其约束来设计数据库。
Foo 可能取决于任何 Bar1 和 Bar2 的存在。Foo 也可以拥有任意数量的 Bar1 和 Bar2。所以这里有两张表来说明这种所有权:
TABLE foo_has_bar1
(
foo_id integer NOT NULL,
bar1_id integer NOT NULL
CONSTRAINT foo_has_bar1_pk PRIMARY KEY (foo_id, bar1_id),
CONSTRAINT foo_has_bar1_fk1 FOREIGN KEY (foo_id) REFERENCES foo (foo_id),
CONSTRAINT foo_has_bar1_fk2 FOREIGN KEY (bar1_id) REFERENCES bar1 (bar1_id)
)
TABLE foo_has_bar2
(
foo_id integer NOT NULL,
bar2_id integer NOT NULL
CONSTRAINT foo_has_bar2_pk PRIMARY KEY (foo_id, bar2_id),
CONSTRAINT foo_has_bar2_fk1 FOREIGN KEY (foo_id) REFERENCES foo (foo_id),
CONSTRAINT foo_has_bar2_fk2 FOREIGN KEY (bar2_id) REFERENCES bar2 (bar2_id)
)
目前,我在任何地方都没有注册用户的 user_id 列。我一直认为我应该将用户数据与模式分开,这些模式当然与 user_id 一起存储在另一个数据库或公共模式中。Catcall
在此线程的答案中也以某种方式这么说,我引用:
“模式是 PostgreSQL 数据库中的命名空间。”
[..]
“如果每个用户都有专用于该用户的数据库对象,您可以轻松地捍卫每个用户实施一个模式的决定 [..]。”
所以我很关心,最佳实践是什么?根据这个线程中所有答案的感觉,我什至不应该考虑使用单独的模式。但是,对于将 object_id 与 user_id [1]联系在一起的每种类型的对象,我是否不必再多一张表?它目前是可以管理的,但我仍然可以看到这将如何使我的“命名空间”变得混乱,而不仅仅是拥有单独的模式。
[1]在 PostgreSQL 中,如果每一行代表一个用户,并且 user_id 之后的每个连续列是一个具有标识对象关系的整数数组的列,我可以将其分解为一个表。但是我对 PostgreSQL 数组(在 PHP 中读取和修改它们)的经验非常糟糕,而且我认为处理它们会比多个表慢。