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' 
);
4

3 回答 3

1

不,不是。您未能在帐户表中为来宾外键提供约束。就目前而言,我可以为同一个客人拥有多个帐户。

考虑将 guestFK 标记为唯一。这也将要求您的关系模型需要重新访问,因为 guestFK 可以用作主键,这将消除对 accountID 的需要。

在您的来宾表中,考虑以下字段的复合键:
名字、姓氏、电子邮件、电话号码

此外,请确保您不存储密码,并且实际上只存储加盐哈希。

于 2013-08-07T18:17:40.433 回答
0

几乎......如果您已经通过guestFK将其与帐户表连接,则不需要guest表中的外键(accountFK)。有两种方法可以做到这一点:

  1. 您将外键 (guestFK) 保留在帐户表中,并从来宾表中删除外键 (accountFK)
  2. 您将外键 (accountFK) 保留在来宾表中,并从帐户表中删除外键 (guestFK)。
于 2013-08-07T18:18:23.280 回答
0

您有guestFK作为引用该guest.guestID字段的外键。外键关系意味着一个账户可以有很多客人。所以就数据库设计而言,答案是否定的,它不是一对一的。

于 2013-08-07T18:18:41.547 回答