2013-08-07 155 views
0

我遇到了與MySQL的關係問題。有人能告訴我這是否是一對一的關係(在帳戶和客人之間)。一對一關係

CREATE TABlE IF NOT EXISTS account 
(
accountID  INT UNSIGNED NOT NULL COMMENT 'primary key', 
guestFK   INT UNSIGNED NOT NULL COMMENT 'account linked to particular guest', 
password  VARCHAR(20)  NOT NULL COMMENT 'password of guest account', 
CONSTRAINT account_PK PRIMARY KEY (accountID), 
CONSTRAINT account_FK FOREIGN KEY (accountID) REFERENCES hotel.guest(guestID) 
); 



CREATE TABLE IF NOT EXISTS guest 
(
guestID  INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'primary key', 
addressFK INT UNSIGNED NOT NULL COMMENT 'foreign key of guest address', 
vehicleFK INT UNSIGNED    COMMENT 'foreign key of guest vehicle', 

firstName VARCHAR(50)  NOT NULL COMMENT 'first name of guest', 
lastName VARCHAR(50)  NOT NULL COMMENT 'last name of guest', 
phoneNum INT UNSIGNED NOT NULL COMMENT 'phone number of guest', 
eMail  VARCHAR(50)  NOT NULL COMMENT 'e-mail address of guest', 

CONSTRAINT guest_PK PRIMARY KEY (guestID), 
CONSTRAINT address_FK FOREIGN KEY (addressFK) REFERENCES hotel.address(addressID), 
CONSTRAINT vehicle_FK FOREIGN KEY (vehicleFK) REFERENCES hotel.vehicle(vehicleID), 
CONSTRAINT email_UQ UNIQUE (eMail) COMMENT 'no two guests should have the same e-mail address', 
CONSTRAINT guest_UQ UNIQUE (firstName, lastName, phoneNum) COMMENT 'no two guests should have same name and phone number' 
); 
+0

CAn 1個帳戶有1個以上的客人? – Mihai

+0

編號我帳戶應該鏈接到一個客人,一個客人應該有一個帳戶。 –

回答

1

不是。您無法在帳戶表中向訪客外鍵提供約束。現在,我可以爲同一個客人設置多個帳戶。

考慮將guestFK標記爲唯一。這也意味着你的關係模型需要重新訪問,因爲guestFK可以作爲主鍵,這將消除對accountID的需求。

在你的客桌考慮在以下領域的複合鍵:
名字,姓氏,電子郵件,電話號碼

另外,還要確保你不存儲密碼和實際上只存儲鹽醃哈希值。

+0

複合鑰匙? –

+0

我怎麼能讓guestFK成爲我賬戶表中的主鍵?我很抱歉,我對SQL很陌生。 –

+0

你基本上將它標記爲唯一。複合鍵是跨越多列的鍵。 – Woot4Moo

0

幾乎...如果您已經通過guestFK將它與帳戶表連接起來,那麼它不需要訪客表中的外鍵(accountFK)。有兩種方法可以做到這一點:

  1. 你保持外鍵(guestFK)在賬戶表,並刪除從客戶表的外鍵(accountFK)
  2. 你保持外鍵(accountFK)在來賓表中並從賬戶表中刪除外鍵(guestFK)。
+1

換句話說,有一個循環引用。那些很糟糕,非常糟糕。現實生活中的情況是,客人可能擁有多個帳戶,在這種情況下,至少應將客戶列中的accountfk列取出。 –

+0

如果我只想讓一位嘉賓和一位嘉賓只訪問一個acc,該怎麼辦?我怎麼能這樣做? –

0

您有guestFK作爲引用guest.guestID字段的外鍵。外鍵關係意味着帳戶可以有許多客人。就DB設計而言,答案將是NO它不是一對一的。

+0

這是一個不好的練習。 – Woot4Moo

+0

@ Woot4Moo你的意思是讓它成爲1比1?是的,這將是糟糕的做法和糟糕的設計。我只是在這裏提到它,因爲OP很困惑,並且希望在事物的黑暗面上發出光芒:) –

+0

@ Woot4Moo我刪除它以避免混淆任何物體:D –