Теперь я знаю, что есть некоторые ответы об отношениях "один на один", но ни один из них не ответил на мой вопрос, поэтому, пожалуйста, прочитайте это до голосования:)
Я пытаюсь достичь отношения "один к одному" в базе данных MySQL. Например, допустим, что у меня есть таблица "Пользователи" и "Таблица учетных записей". И я хочу быть уверенным, что Пользователь может иметь только одну учетную запись. И что может быть только одна учетная запись для каждого пользователя.
Я нашел два решения для этого, но не знаю, что использовать, и есть ли другие варианты.
Первое решение:
DROP DATABASE IF EXISTS test;
CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci;
USE test;
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
CREATE TABLE accounts(
id INT NOT NULL AUTO_INCREMENT,
account_name VARCHAR(45) NOT NULL,
user_id INT UNIQUE,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
В этом примере я определяю внешний ключ в аккаунтах, указывающих на первичный ключ у пользователей. И тогда я делаю внешний ключ UNIQUE, поэтому в аккаунтах могут быть два одинаковых пользователя. Чтобы присоединиться к таблицам, я бы использовал этот запрос:
SELECT * FROM users JOIN accounts ON users.id = accounts.user_id;
Второе решение:
DROP DATABASE IF EXISTS test;
CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci;
USE test;
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
CREATE TABLE accounts(
id INT NOT NULL AUTO_INCREMENT,
account_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(id) REFERENCES users(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
В этом примере я создаю внешний ключ, который указывает от первичного ключа на первичный ключ в другой таблице. Поскольку первичные ключи по умолчанию UNIQUE, это делает это отношение "один к одному". Чтобы присоединиться к таблицам, я могу использовать это:
SELECT * FROM users JOIN accounts ON users.id = accounts.id;
Теперь вопросы:
- Каков наилучший способ создания отношений One to One в MySQL?
- Есть ли другие решения, кроме этих двух?
Я использую MySQL Workbench, и когда я создаю отношения One To One на диаграмме EER и позволяю MySQL Workbench создавать SQL-код, я могу получить отношение "Один к многим": S Что меня смущает: S
И если я импортирую какое-либо из этих решений в диаграмму EER MySQL Workbench, он распознает отношения как от одного до многих: S Thats также запутывает.
Итак, что было бы лучшим способом определить отношения Один к одному в MySQL DDL. И какие варианты есть для этого?
Спасибо!!