图片中的所有表都是链式的,并且具有标准化
数据库来获取例如来自特定国家的所有用户我
必须加入所有表格。
您必须连接所有表格,因为您使用代理键(ID 号),而不是因为表格已“规范化”。使用 id 号码之类的代理键与规范化无关。
自然键和外键约束是您解决问题所需要的一切。
了解其工作原理的最简单方法是从完整数据开始,然后完全倒退。假设所有数据都是正确的。
addr_id street street_num region city country
--
1 Babukiaeeva 3a 10000 Zagreb Croatia
2 Riva 16 51000 Rijeka Croatia
3 Andrije Hebranga 2-4 10000 Zagreb Croatia
4 Andrijeviaeeva 2 110000 Zagreb Croatia
要记录诸如“地区 '10000' 与国家 '克罗地亚' 中的城市 '萨格勒布' 相关联”之类的事实,请创建一个新表,并从该查询中填充它。
SELECT DISTINCT region, city, country from addresses;
表格将如下所示。
Table: regions
Primary key: {region, city, country}
region city country
--
10000 Zagreb Croatia
51000 Rijeka Croatia
110000 Zagreb Croatia
然后设置一个外键引用。
ALTER TABLE addresses
ADD CONSTRAINT FOREIGN KEY (region, city, country)
REFERENCES regions (region, city, country);
要记录“城市'萨格勒布'在国家'克罗地亚'”这样的事实,请创建一个新表,并从此查询填充它。
SELECT DISTINCT city, country from regions;
表格将如下所示。
Table: cities
Primary key: {city, country}
city country
--
Zagreb Croatia
Rijeka Croatia
然后设置一个外键引用。
ALTER TABLE regions
ADD CONSTRAINT FOREIGN KEY (city, country)
REFERENCES cities (city, country);
对国家/地区重复。表国家、城市和地区都是关键,所以它们在 5NF 中。 (它们不能有任何非键依赖,因为它们没有非键列。)在大区域的上下文中,像整个欧洲一样,地址表很可能也在 5NF 中。
就查询性能而言,它可能会围绕您当前的架构运行,因为它不需要连接。
您可能想要使用ON UPDATE CASCADE;不过,您可能不想要级联删除。