2013-08-07 4 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 может служить в качестве первичного ключа, что устраняет необходимость в идентификаторе учетной записи.

В гостевой таблице рассмотрит составной ключ в течение следующих областей:
ПгвЬЫат, фамилия, адрес электронной почты, номер телефона

Кроме того, убедитесь, что вы не хранить пароли и действительно только хранение соленых хэш.

+0

Комбинированный ключ? –

+0

Как я могу сделать guestFK основным ключом в моей учетной записи? Извините, я действительно новичок в SQL. –

+0

Вы по существу отметили бы его как уникальное. Композитные клавиши - это клавиши, которые охватывают несколько столбцов. – Woot4Moo

0

Практически ... Иностранному ключу (accountFK) в гостевой таблице необязательно, если вы уже подключили его к таблице счетов guestFK. Есть два способа сделать это:

  1. Вы держите внешний ключ (guestFK) в таблице счетов и удаление внешнего ключа (accountFK) из таблицы гостевой
  2. Вы держать внешний ключ (accountFK) в гостевой таблице и удалите внешний ключ (guestFK) из таблицы учетных записей.
+1

Другими словами, имеется круговая ссылка. Это плохо, очень плохо. Реальная ситуация в жизни заключается в том, что у гостей может быть более одного аккаунта, и в этом случае, как минимум, возьмите столбец accountfk из таблицы гостей. –

+0

Что делать, если я просто хочу один acc для одного гостя и одного гостя для доступа только к одному acc? Как я мог это сделать? –

0

У вас есть guestFK как внешний ключ, ссылающийся на поле guest.guestID. Отношение внешних ключей означает, что на счету может быть много гостей. SO в плане дизайна БД, ответ будет NO это не один к одному.

+0

Это плохая практика fyi. – Woot4Moo

+0

@ Woot4Moo вы имеете в виду сделать это 1 к 1? да, это была бы плохая практика и плохой дизайн. Я только упомянул об этом здесь, потому что ОП был смущен и хотел пролить свет на темную сторону вещей :) –

+0

@ Woot4Moo Я удалил его, чтобы избежать путаницы с телом: D –

Смежные вопросы