Mysql

連接表是一個好習慣嗎?

  • June 29, 2021

假設我有一個包含使用者資訊的大表和另一個包含多個位置的表。然後我使用另一個包含 user_id 和 location_id 的表。

為了檢索數據,我必須使用 Left Join 查詢。這不是使整個過程的檢索時間更長,而不是全部放在一張表中嗎?例如,我可以將位置作為文本放在同一張桌子上。

編輯:這是一個例子。

CREATE TABLE  `user` (
`id` int(11) NOT NULL,
 `name` varchar(45) DEFAULT NULL,
 `gender` enum('M','F') DEFAULT NULL
);

CREATE TABLE `user_location` (
 `user_id` int(11) NOT NULL,
 `location_id` int(11) NOT NULL
);

CREATE TABLE `location` (
`id` int(11) NOT NULL,
 `location` varchar(45),
 `parent_id` varchar(45) 
);

注意:請假設所有相關欄位都在它們之間正確索引。

編輯:我目前有一個大型數據庫,使用者通過上述聯結表檢索他們的位置。我被要求優化數據庫,因為搜尋結果很慢。我已經添加memcache並且它顯著改進但現在我只是想知道左連接。

例如,目前查詢是這樣的:

SELECT * FROM users 
LEFT JOIN user_location 
ON user_location.user_id = user.id 
LEFT JOIN location
ON location.id = user_location.location_id;

這只是為了獲得位置。它們還有幾個其他欄位可以通過聯結檢索,並且它們都是查看使用者配置文件所必需的。我們的電話號碼、地址、密碼、出生日期和許多其他資訊都在不同的表格中。

為了讓我為使用者配置文件創建一個頁面,我必須向伺服器發送一個大查詢。現在在第一次它被記憶體之後,它很好。但我只是想知道為什麼有人會這樣建構他們的數據庫?

如果你把所有東西都放在一張桌子上,你會得到一張更大的、多餘的桌子。

如果所有表都被正確索引,3表解決方案會很快,因為每次查詢都會讀取少量行。

連接表是關係數據庫設計中的標準做法。

如果兩個實體之間存在多對多關係,則表示它們的標準方法是使用三個表。

其中兩個表是實體表,具有主鍵。聯結表位於它們之間(邏輯上)並包含兩個外鍵,一個引用每個實體表。通常,這兩個外鍵將是聯結表中僅有的兩列。

引用自:https://dba.stackexchange.com/questions/106001