我在与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 :(得分:1)
不,不是。您无法在帐户表中向guest虚拟机外键提供约束。就目前而言,我可以为同一位客人提供多个帐户。
考虑将guestFK标记为唯一。这也将要求您的关系模型需要重新访问,因为guestFK可以作为主键,这将消除对accountID的需求。
在您的访客表中,考虑以下字段的复合键:
名字,姓氏,电子邮件,电话号码
另外,请确保您没有存储密码,并且实际上只存储盐渍哈希。
答案 1 :(得分:0)
几乎......如果您已经通过guestFK将其与帐户表连接,则不需要来宾表中的外键(accountFK)。有两种方法可以做到这一点:
答案 2 :(得分:0)
您有guestFK
作为引用guest.guestID
字段的外键。外键关系意味着帐户可以包含许多访客。因此在数据库设计方面,答案是否它不是一对一的。