您的列表中缺少一个实体是branch(公司的)。那么表定义是:
CREATE TABLE country (
id integer NOT NULL PRIMARY KEY,
name varchar NOT NULL,
population integer NOT NULL
);
CREATE TABLE city (
id integer NOT NULL PRIMARY KEY,
name varchar NOT NULL,
population integer NOT NULL,
country integer NOT NULL REFERENCES country(id)
);
简单。你有一个国家列表和一个城市列表。城市记录有一个列country,它引用country 表中的正确记录。此处未设置城市名称UNIQUE,因为不同的国家可以拥有同名的城市(英语、荷兰语、葡萄牙语和西班牙帝国创建了具有旧名称的新城市,这些旧名称有时可以区分(纽约)但并非总是如此(例如墨尔本) ))。如果您确实希望城市名称是唯一的,请将 UNIQUE 子句附加到 name 列。
CREATE TABLE company (
id integer NOT NULL PRIMARY KEY,
name varchar NOT NULL
);
CREATE TABLE branch (
company integer NOT NULL REFERENCES company(id),
city integer NOT NULL REFERENCES city(id),
name varchar,
employees integer NOT NULL,
PRIMARY KEY (company, city)
);
这里的诀窍是,公司分支机构的 PK 是在公司标识符和城市标识符组合上定义的。 PK 在表中始终是唯一的。
假设您希望在单个查询中计算人口计数和雇员,这样就可以解决问题:
SELECT
company.name AS company,
branch.name AS branch,
city.name AS city,
branch.employees,
city.population AS city_pop,
country.population AS country_pop
FROM company
JOIN branch ON branch.company = company.id
JOIN city ON city.id = branch.city
JOIN country ON country.id = city.country
ORDER BY company.name, branch.name;