所有的图片中的表链式,并用标准化 数据库获得例如所有来自特定国家的用户我 必须参加所有表。
您必须加入所有表格,因为您使用代理键(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
;虽然你可能想要级联删除而不是。
正如我所说,这是一个简化的模型。这种结构是必要的。至于记录的数量,你必须能够在世界的任何地方进行注册,所以帖子中的数字几乎可以召唤它。有多少用户很难预测......无论如何它必须能够处理几十万用户。另外值得一提的是,很多查询都是针对特定国家/地区的,因此一次又一次地加入所有内容似乎太多了 – ZolaKt
然后在users表中有一个countryID,一个StateID和一个......等等。除非您需要水印一些复杂的商业目的,我强烈建议避免它。 –
好的,但问题是如何确保一致性是一个这样的模型,而不是真正的使用它。 – ZolaKt