由于某种原因,它具有“sql”标签,所以这是我在 SQL 中的操作方式(请注意,自始至终都有引用整数,没有 NULLable 列):
CREATE TABLE Countries
(
country_code CHAR(3) NOT NULL UNIQUE
);
CREATE TABLE Cities
(
city_name VARCHAR(20) NOT NULL,
country_code CHAR(3) NOT NULL
REFERENCES Countries (country_code),
UNIQUE (country_code, city_name)
);
CREATE TABLE Users
(
username CHAR(8) NOT NULL UNIQUE,
country_code CHAR(3) NOT NULL,
UNIQUE (country_code, username)
);
CREATE TABLE UsersCountries
(
username CHAR(8) NOT NULL UNIQUE,
country_code CHAR(3) NOT NULL,
FOREIGN KEY (country_code, username)
REFERENCES Users (country_code, username),
city_name VARCHAR(20) NOT NULL,
FOREIGN KEY (country_code, city_name)
REFERENCES Cities (country_code, city_name)
);
测试数据:
INSERT INTO Countries (country_code) VALUES
('ITL'),
('ESP');
INSERT INTO Cities (city_name, country_code)
VALUES
('Roma', 'ITL'),
('Naples', 'ITL'),
('Barcelona', 'ESP'),
('Madrid', 'ESP');
INSERT INTO Users (username, country_code) VALUES
('00000001', 'ESP'),
('00000002', 'ESP'),
('00000003', 'ITL'),
('00000004', 'ITL');
INSERT INTO UsersCountries (username, city_name, country_code)
VALUES
('00000002', 'Madrid', 'ESP'),
('00000004', 'Roma', 'ITL');
公平地说,大多数 SQL 编码人员不会反感使用 NULLable 列,而是希望所有用户的详细信息都出现在一个表中。假设您的 SQL 产品(正确地)没有将 NULL 视为一个值(例如 MS SQL Server 没有,但 MS Access 有),那么以下内容将起作用并且等效于上述结构(即,尽管存在,但仍然存在引用整数NULLable 列):
CREATE TABLE Users
(
username CHAR(8) NOT NULL UNIQUE,
city_name VARCHAR(20),
country_code CHAR(3) NOT NULL
REFERENCES Countries (country_code),
FOREIGN KEY (country_code, city_name)
REFERENCES Cities (country_code, city_name)
);
INSERT INTO Users (username, city_name, country_code) VALUES
('00000001', NULL, 'ESP'),
('00000002', 'Madrid', 'ESP'),
('00000003', NULL, 'ITL'),
('00000004', 'Roma', 'ITL');