2011-07-19 18 views
0

約束我有以下3個表如何指定用2臺

CREATE TABLE BUBBLES_CSC (
CSC_ID integer UNSIGNED NOT NULL AUTO_INCREMENT, 
COUNTRY_NAME varchar(255) NOT NULL, 
STATE_NAME varchar(255) NOT NULL, 
CITY_NAME varchar(255) NOT NULL, 
PRIMARY KEY(CSC_ID,STATE_NAME,CITY_NAME), 
INDEX(CSC_ID ,CITY_NAME,COUNTRY_NAME) 
); 

CREATE TABLE BUBBLES_REGION (
REGION_ID integer UNSIGNED NOT NULL AUTO_INCREMENT, 
REGION_NAME varchar(255) NOT NULL, 
CSC_ID integer UNSIGNED NOT NULL, 
PRIMARY KEY(REGION_ID), 
FOREIGN KEY (CSC_ID) REFERENCES BUBBLES_CSC(CSC_ID) ON UPDATE CASCADE ON DELETE CASCADE, 
INDEX(REGION_ID ,REGION_NAME ,CSC_ID) 
); 

CREATE TABLE BUBBLES_HOTEL (
HOTEL_ID integer UNSIGNED NOT NULL AUTO_INCREMENT, 
NAME varchar(255) NOT NULL, 
DESCRIPTION varchar(255) DEFAULT "No description", 
CSC_ID integer UNSIGNED NOT NULL, 
REGION_ID integer UNSIGNED NOT NULL, 
STREET_ADDRESS varchar(255) DEFAULT NULL, 
PRIMARY KEY(HOTEL_ID), 
FOREIGN KEY (CSC_ID) REFERENCES BUBBLES_CSC(CSC_ID) ON UPDATE CASCADE, 
FOREIGN KEY (REGION_ID) REFERENCES BUBBLES_REGION(REGION_ID) ON UPDATE CASCADE, 
INDEX(HOTEL_ID,NAME,CSC_ID,REGION_ID) 
)CHARACTER SET=utf8; 

現在我知道該怎麼做一個外鍵,但如何指定符合規定CSC_ID的CSC_ID在BUBBLES_HOTEL應該是相同的BUBBLES_HOTEL中REGION_ID指向的行的BUBBLES_REGION中

回答

1

執行此操作的正確方法是根本不在BUBBLES_HOTEL中有CSC_ID列。 BUBBLES_HOTEL中的每一行都包含指向BUBBLES_REGION中某一行的鏈接,該鏈接又包含指向BUBBLES_CSC中某一行的鏈接。這就是你如何識別中某一行對應的BUBBLES_CSC中的哪一行。您當前的設計未規範化。

說了這麼多,你可以實現你BUBBLES_HOTEL問通過更換兩個外鍵只有一個:

FOREIGN KEY (CSC_ID, REGION_ID) REFERENCES BUBBLES_REGION (CSC_ID, REGION_ID) 
+0

我參考了酒店的表格,並且搜索了很多其他2張桌子。如果我按照你說的那樣創建一個外鍵關係,它將對我的查詢獲取功能產生任何影響,並且在檢索所有三個表中的單個行的數據時使其更慢。 – footy

+0

您可能希望在'BUBBLES_HOTEL'上添加索引與'REGION_ID'作爲第一列(因爲它不會被隱式索引)。 – Hammerite

1

我認爲這三個關係,創建一個到一到一個鏈。如果是這樣,你不應該有BUBBLES_HOTEL中的CSC_ID列,它是多餘的:你總是可以通過BUBBLES_REGION獲得它。

+0

如果我使用HOTEL表搜索一個LOT,那麼冗餘表是有利的嗎?那是我的想法。因爲我在搜索時需要多次搜索所有3個表格中的表格數據 – footy

+0

這取決於表格HOTEL中的行數。如果您正在談論數十或數百個條目,我懷疑您需要擔心SQL查詢的效率。另一方面,如果有成千上萬的酒店,建立一個關係而不是三個關係可能是明智的。但是SQL優化超出了我的理解。 –

+0

酒店的數量約爲10000但其他2個表格在100-999之間。 – footy

相關問題