如何正确创建相互引用的表?

How to correctly create tables that reference each other?

Table "users" 取决于 "companies"、"positions" 和 "employees":

create table companies(id serial primary key,
"name" varchar,
"comment" varchar,
lastmodified_datetime timestampz default now());

create table positions(id serial primary key,
"name" varchar,
"comment" varchar,
lastmodified_datetime timestampz default now());

create table employees(id serial primary key,
"name" varchar,
"comment" varchar,
firstname varchar,
middlename varchar,
lastname varchar,
isoffice boolean default true,
"position" integer references positions(id),
lastmodified_datetime timestampz default now());

create table users(id serial primary key,
"name" varchar,
"comment" varchar,
"login" varchar not null,
"password" varchar not null,
isadministrator boolean,
company integer references companies(id),
employee integer references employees(id),
lastlogged_datetime timestampz default now(),
lastmodified_datetime timestampz default now());

每一行都有一个 "lastmodified_datetime" 列来存储时间,但我还想存储有关用户的信息(添加 lastmodified_user integer references users(id) 列)。

这会造成一种情况,为了创建基本的 table,我需要一个已经存在的 "users" table,但为了创建 "users" tables,我需要基本的 tables。我还读到 in this SO question 循环引用会导致糟糕的设计。

如何在PostgreSQL 上下文中正确实现它? 当我尝试创建一个 table 引用另一个尚不存在的 table 时,PostgreSQL 中止了符合逻辑的查询。我应该先创建所有 table 然后更改它们以包含这些引用还是有其他方法?

我认为这不是问题,因为 companyemployee 列是 null-able。因此,您可以插入一个用户,然后允许修改其他用户。

以类似的方式,您可以使用 last_modified_by_user(我认为该名称更具描述性)并在创建记录时将其保留 NULL。然后,修改将仅用于 更改 记录,而不是原始记录。

如果您尝试创建这些列,您将遇到问题 NOT NULL