我正在编写一个使用 MySQL 的会计应用程序,但我正在考虑切换到 PostgreSQL。我的应用程序有一个meta
数据库,用于存储用户、文档类型、公司列表等。每个公司(簿记实体)都有自己的数据库。每个公司的documents
表可能看起来像这样,当然还有其他列:
文档ID | 创建者用户ID | 文档类型ID |
---|---|---|
1个 | 1个 | 1个 |
2个 | 1个 | 1个 |
3个 | 2个 | 5个 |
4个 | 1个 | 3个 |
createdByUserID
和分别documentTypeID
有meta.users.userID
和的外键meta.documentTypes.documentTypeID
。MySQL 不介意外键转到其他数据库。我想users
为我的应用程序(以及documentTypes
其他东西)准备一张表,并且我想将每家公司的数据放在单独的数据库中。
我在这里看到PostgresSQL 不处理跨数据库外键。我如何在 PostgreSQL 中实现这种功能?通常如何处理这种情况?
使用模式而不是数据库来分隔表。
在 MySQL 中,“模式”和“数据库”是同义词。它们指的是同一事物,即一级命名空间。您可以在单独的模式中查询表,例如使用连接或创建外键。由于数据库和模式在 MySQL 中是一回事,因此您可以轻松地进行跨数据库查询和引用。模式就像一个子目录。您可以
USE <schemaname>
更改默认架构,就像您可以cd
在 Bash shell 中更改目录一样,然后使用限定名称访问其他目录中的内容。在 PostgreSQL 中,“模式”和“数据库”不是一回事。Schema 与 MySQL 非常相似,是表的命名空间。但是数据库更像是
setroot
在 UNIX shell 中。当客户端连接到数据库时,该客户端看不到其他数据库中的模式。一个数据库中的表不能引用另一个数据库中的表。如果表应该相互引用,或者如果您可能在同一个会话中查询两个表,那么您真的不应该将表保存在不同的数据库中。数据库用于分离不同应用程序的模式或表的集合。如果它们是相关的,它们应该在同一个数据库中(尽管它们可能被组织到该数据库中的模式中)。