所有的圖片中的錶鏈式,並用標準化 數據庫獲得例如所有來自特定國家的用戶我 必須參加所有表。
您必須加入所有表格,因爲您使用代理鍵(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